3

以下は、示されているように例外が発生するコードのブロックです。

コード :

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 でのみ発生します。問題を回避するために上記のコードを変更するにはどうすればよいですか? また、スタンドアロン コードでこの問題を再現する方法を教えてください。

4

1 に答える 1

3

等しいオブジェクトでは 0 を返す必要があります。

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

ここでもっと読むことができます

于 2013-04-18T08:59:25.767 に答える