gpt4 book ai didi

Java7 - 比较方法违反了其一般契约(TimSort.java)

转载 作者:行者123 更新时间:2023-12-01 07:19:24 27 4
gpt4 key购买 nike

这是我得到的堆栈跟踪

Caused by: java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:777)
at java.util.TimSort.mergeAt(TimSort.java:514)
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:1454)
at java.util.Collections.sort(Collections.java:175)
at xxx.sortDisplayFields(OfferFieldLayout.java:521)

这是比较方法:

  public int compare(Field pObject1, Field pObject2)
{
int compare = 0;

//...
if (compare == 0)
{
if (pObject1.hashCode() <= pObject2.hashCode())
{
compare = -1;
}
else
{
compare = 1;
}
}

return compare;
}

我认为这是由于传递性属性没有得到尊重:传递性:如果 A > B 且 B > C,则对于任意 A、B 和 C:A > C。我试图想出一个反例,但我在这里失败了,感谢任何帮助!

最佳答案

你的函数永远不能返回 0!这意味着,如果对象中的所有内容(包括哈希码)都相等,则 pObject1.compare(pObject2) 将不等于 pObject2.compare(pObject1)。比较函数必须是对称的。我还认为您在该测试中交换了 -11,因此您的最后一次检查应该是这样的:

if (compare == 0) {
if (pObject1.hashCode() < pObject2.hashCode()) {
compare = 1;
} else if (pObject1.hashCode() > pObject2.hashCode()) {
compare = -1;
}
}

return compare;

顺便说一句,您的对象应该实现 Comparable 接口(interface),并且该方法应该调用 compareTo

最后,比较哈希码一开始就不是一个好主意。即使对象不相等,它们也可能发生碰撞。这意味着当对象不相等时,您的 compareTo 方法可以返回 0。这也违反了 compareTo 合约。

关于Java7 - 比较方法违反了其一般契约(TimSort.java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45174633/

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