gpt4 book ai didi

使用 Math.abs(diff) 排序时出现 Java 意外 IllegalArgumentException

转载 作者:行者123 更新时间:2023-12-01 19:46:22 26 4
gpt4 key购买 nike

在对 double 列表进行排序时,我出现了一些我没有预料到的行为。我的目标是对 double 列表进行排序,但是当两个 double 彼此靠近时,我不关心它们的顺序(实际上,我使用带有 Double 作为值的 Entry<> ,并且当两个 Double 值很接近,我根据其他内容进行排序。

下面是一个将抛出 IllegalArgumentException 的示例:

public static void main(String[] args) {
final float probabilitySortMargin = 0.2f;
Comparator<Double> comp = new Comparator<Double>() {
@Override
public int compare(Double o1, Double o2) {
// sort on probability first
double diff = Math.abs(o1 - o2);
if(diff > probabilitySortMargin)
// difference is more than desired range, sort descending
return Double.compare(o2 , o1);
return 0;
}
};

ArrayList<Double> vals = new ArrayList<>();
Random r = new Random(0);
for(int i=0;i<1000;i++)
vals.add(r.nextDouble());

for(int i=0;i<vals.size();i++)
for(int j=0;j<vals.size();j++)
if(comp.compare(vals.get(i), vals.get(j)) != -1 * comp.compare(vals.get(j), vals.get(i)))
System.out.println("Comparison failed");

Collections.sort(vals, comp);
}

结果

Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:899)
at java.util.TimSort.mergeAt(TimSort.java:516)
at java.util.TimSort.mergeCollapse(TimSort.java:441)
at java.util.TimSort.sort(TimSort.java:245)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1462)
at java.util.Collections.sort(Collections.java:175)
at some.package.Sample.main(Sample.java:10)

为什么会发生这种情况?更奇怪的是,打印错误消息“比较失败”。

最佳答案

您的compare方法确实违反了Comparator的契约(Contract)界面。

the implementor must ensure that compare(x, y)==0implies that sgn(compare(x, z))==sgn(compare(y, z)) for all z.

compare(0.1,0.2) == 0, but sgn(compare(0.1,0.35)) != sgn(compare (0.2,0.35))

“比较失败”永远不会被打印,因为您的方法没有违反 sgn(compare(x, y)) ==-sgn(compare(y, x))要求。

关于使用 Math.abs(diff) 排序时出现 Java 意外 IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53172078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com