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)
假设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)