"比较方法违反了其总合同!"

CoX*_*ier -2 java

我搜索了一些同样的问题,我知道原因.但是只发生一次坠机,所以我来这里问你可能会导致什么样的事故.

    Collections.sort(downloadTasks, new Comparator<DownloadTask>() {
        @Override
        public int compare(DownloadTask lhs, DownloadTask rhs) {
            if (lhs == null || rhs == null) return 0;
            return (int) (lhs.mTaskInfo.time - rhs.mTaskInfo.time);
        }
    });
Run Code Online (Sandbox Code Playgroud)

错误是:

java.lang.IllegalArgumentException:比较方法违反了它的一般合同!在java.util.TimSort.mergeHi(TimSort.java:864)java.util.TimSort.mergeAt(TimSort.java:481)java.util.TimSort.mergeCollapse(TimSort.java:406)java.util. TimSort.sort(TimSort.java:210)java.util.TimSort.sort(TimSort.java:169)java.util.Arrays.sort(Arrays.java:2010)at java.util.Collections.sort(Collections)的.java:1883)

如您所见,我通过其time成员比较两个对象.该timelong类型.

我认为崩溃可能来自:

  • 是否将long转换为int会导致崩溃?
  • if(lhs == null || rhs == null)返回0; 但理论上lhs和rhs都不为空.

编辑

如果lhs并且rhs可以为null,我该怎么办?

编辑Android版

在Android中,Long.compare()需要API 19.您可以在API 19下执行此操作:

public static int compare(long lhs, long rhs) {
    return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
}
Run Code Online (Sandbox Code Playgroud)

Thi*_*ilo 5

这两种情况都有问题.

if (lhs == null || rhs == null) return 0;

如果你有[123, null, 234],那么你比较123等于null,null等于234,并且通过传递你应该得到123等于234.但这不是你的比较器返回的东西.

这里的解决办法是要么禁止null或排序的所有nulls的底部(或顶部),即只回报0两个都是null,否则返回1-1(上取决于null被左或右).

return(int)(lhs.mTaskInfo.time - rhs.mTaskInfo.time);

考虑比较Integer.MAX_VALUE + 10.两者的区别在于Integer.MAX_VALUE + 1.将其转换为int包装Integer.MIN_VALUE.然后相反的比较应该给你- Integer.MIN_VALUE,但这Integer.MIN_VALUE由于溢出.

这里的解决方案是使用Long.compare(a,b).