我目前正在努力用 Java 对集合进行排序。我收到错误消息“Comparison method violates its General contract”。我也理解此错误消息,但我(主要)使用 Long 类型的内置 compareTo-Method。所以我不知道,在这种情况下 sort 方法仍然违反了契约(Contract)。这是我的代码:
@Override
public int compareTo(DataAge another) {
if(this == null || another == null)
return 0;
Long a = new Long(this.getAge());
Long b = new Long(another.getAge());
return a.compareTo(b);
}
这里是错误:
Java exception occurred:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.ComparableTimSort.mergeLo(Unknown Source)
at java.util.ComparableTimSort.mergeAt(Unknown Source)
at java.util.ComparableTimSort.mergeCollapse(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at dd.GMAAnalyzer.sortData(Analyzer.java:158)
最佳答案
假设 null
是允许的,你的方法的逻辑是不正确的,因为 null
比较等于任何东西。这是错误的,因为它将比较等于多个本身不相等的事物,从而破坏了传递性。
要解决此问题,请确定 null
应该排在其他数字的前面还是后面,并添加一个单独的 null
比较(this
不能等于 null
,因此您不需要对其进行比较)。
if(another == null)
return 1; // If you want nulls in the back, return -1
关于java - 建筑物 compareTo : Comparison method violates its general contract,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38565922/