gpt4 book ai didi

java - 比较方法违反其一般契约异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:42 25 4
gpt4 key购买 nike

下面是导致异常的代码块,

代码:

Collections.sort( arrayList, new Comparator() 
{
public int compare( Object o1, Object o2 )
{
TypeAdapterSort tas1 = ( TypeAdapterSort ) o1;
TypeAdapterSort tas2 = ( TypeAdapterSort ) o2;
if ( tas1.order < tas2.order )
return -1;
else
return 1;
}
} );

异常:

java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(TimSort.java:747)
at java.util.TimSort.mergeAt(TimSort.java:483)
at java.util.TimSort.mergeForceCollapse(TimSort.java:426)
at java.util.TimSort.sort(TimSort.java:223)
at java.util.TimSort.sort(TimSort.java:173)
at java.util.Arrays.sort(Arrays.java:659)
at java.util.Collections.sort(Collections.java:217)

当我运行与独立程序相同的代码时,问题从未发生。这里的比较器有什么问题?有没有办法在独立代码中重现该问题?

此问题仅发生在 Java 1.7 上,因为 Arrays.sort 和 Collections.sort 的实现发生了变化。如何更改上述代码以避免出现此问题?另外,如何在独立代码中重现此问题?

最佳答案

您需要在相等的对象上返回 0。

        if ( tas1.order < tas2.order ){
return -1;
} else if ( tas1.order == tas2.order ){
return 0;
} else {
return 1;
}

您可以阅读 here更多

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

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