buildin compareTo:比较方法违反了其总合同

Tho*_*ten 1 java sorting collections

我目前正在努力在Java中对Collection进行排序.我收到错误消息"比较方法违反了其总合同".我也理解这个错误信息,但我(大多数时候)使用Long类型的buildin compareTo-Method.所以我不知道,在这种情况下,sort方法仍然违反了合同.这是我的代码:

@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);
}
Run Code Online (Sandbox Code Playgroud)

这里的错误:

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)
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

假设null允许s,你的方法的逻辑是不正确的,因为null比较等于任何东西.这是错误的,因为它会比较等于多个不相等的东西,从而打破了传递性.

要解决此问题,请确定nulls应该排在前面还是排在其他数字的后面,并添加一个单独的null比较(this不能等于null,所以你不需要对它进行比较).

if(another == null)
    return 1; // If you want nulls in the back, return -1
Run Code Online (Sandbox Code Playgroud)