比较方法违反了其一般合同的例外

下面是一个代码块,导致exception,如图所示,

代码:

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; } 

你可以在这里阅读更多