Java 比较法引发一般合同例外

Java 比较法引发一般合同例外,java,collections,comparator,Java,Collections,Comparator,下面是导致异常的代码块,如图所示 代码: Collections.sort( arrayList, new Comparator() { public int compare( Object o1, Object o2 ) { TypeAdapterSort tas1 = ( TypeAdapterSort ) o1; T

下面是导致异常的代码块,如图所示

代码:

            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的实现发生了更改。如何更改上述代码以避免此问题?。另外,如何在独立代码中重现此问题?

比较器不遵守总合同。看看这个:

if ( tas1.order < tas2.order )
    return -1;
else
    return 1;
}
或者,如果您使用的是早期版本:

return tas1.order == tas2.order ? 0
     : tas1.order < tas2.order ? -1
     : 1;
return tas1.order==tas2.order?0
:tas1.order
您不需要只返回-1或1。一般合同规定,如果第一个元素较小,则返回的数字必须为负数;如果它们相等,则返回的数字必须为零;如果第二个元素较小,则返回的数字必须为正数。因此,您可以跳过if/else语句,只返回:

return tas1.order - tas2.order;

可能重复。可能重复多次停止问同一个问题。谢谢Jon。但是,为什么代码块在独立程序中运行时不会抛出异常。@Mohan:您的比较代码本身不会检查它是否遵守了
compare
的约定-只是因为排序代码注意到您给它的结果是假的,所以您得到了异常。谢谢Jon。在上面的代码中,如果arraylist以顺序值为5、3和1的TypeAdapterSort对象为例,并且调用了Collections.sort方法,则不会引发异常。为什么会出现这种行为?即使arraylist具有相同顺序值的对象,在独立程序中运行代码块时也不会引发异常。我使用JRE 1.7.07考虑如果<代码> TAS1。订单< /代码>是整数。
return tas1.order - tas2.order;