比较法违反其总承包异常(Comparison method violates its general

2019-08-31 10:47发布

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

代码:

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)

当我运行相同的代码作为一个独立的程序,从未出现问题。 什么是这里比较的问题? 有没有办法重现该问题在一个独立的代码?

因为一直在Arrays.sort&Collections.sort实施变化只发生于Java 1.7这个问题。 如何更改上面的代码,以避免这个问题? 此外,如何重现在一个独立的代码这个问题?

Answer 1:

您需要在相等的对象返回0。

        if ( tas1.order < tas2.order ){
            return -1;
        } else if ( tas1.order == tas2.order ){
            return 0;
        } else {
            return 1;
        }

你可以阅读这里更多



文章来源: Comparison method violates its general contract Exception