gpt4 book ai didi

Java 7 - "Comparison method violates its general contract!"

转载 作者:行者123 更新时间:2023-11-29 07:44:06 28 4
gpt4 key购买 nike

一切似乎都运行良好(连续几天),但我只遇到过一次问题并且很难重现该问题。

“比较法违反了它的一般契约!”被扔了,完全让我措手不及。我有以下内容:

public class CustomComparator implements Comparator<Chromosome> {

public int compare(Chromosome c1, Chromosome c2){

return c1.compareTo(c2);
}

}

我的染色体类:

public class Chromosome implements Comparable<Chromosome>{

private double rank;

//bunch of methods...

@Override public int compareTo(Chromosome c){

final int BEFORE = -1;
final int EQUAL = 0;
final int AFTER = 1;

if (this.getRank() == c.getRank()) //getRank() simply returns a double value 'rank'
return EQUAL;

else if (this.getRank() < c.getRank())
return BEFORE;

else //i.e. (this.getRank() > c.getRank())
return AFTER;

}

我有一个 ArrayList,我同时使用了 Collections.sort(MyList) 和 Collections.sort(MyList, Collections.reverseOrder())。到目前为止,他们仍然工作得很好。在 100 次运行中,我只遇到过一次该错误。这个实现有问题吗?

最佳答案

Java 7 稍微改变了排序算法的行为。如果检测到违反 compareTo 方法的一般约定,它们现在会抛出异常。您可以阅读该合约的属性,例如 here .

通常它可能会被违反,例如在解析为 a < b 和 b < a 的情况下。如果这是在 Java 7 之前检测到的,它就会被默默地忽略。现在将抛出异常。

如果你想使用旧的行为,你可以使用以下内容:

System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");

但我不鼓励你这样做。您应该通过 Double.compare(a, b) 将您的实现更改为双重比较的标准实现。 .此实现正确处理 double 的无穷大和 NaN 值。

此外,如果您的 Comparator 只是委托(delegate)给 compareTo 方法,它通常可以被丢弃。

关于Java 7 - "Comparison method violates its general contract!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27332170/

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