1
4

4 に答える 4

7

これは、コンパレータにバグがあることを意味しますcompareTo(a, b) != -compareTo(b, a)

于 2012-11-04T12:51:43.300 に答える
5

私見ですが、これはコンパレータよりもソート アルゴリズムのバグのようなにおいがします。

私には、これは、入力セットのサイズに応じて 2 つの異なる並べ替えアルゴリズムが使用されているようなにおいがします。

ソートの実装にバグがあることは不可能ではありませんが、例外メッセージが言っているように、コンパレータに問題がある可能性がはるかに高くなります。ライブラリ コードの (おそらく存在しない) バグを探すのではなく、コードに集中することをお勧めします。

于 2012-11-04T12:49:54.257 に答える
2

Stephen C がすでに推測したように、これは 2 つの異なる並べ替え方法が使用された結果です。

のコードを見てくださいjava.util.TimSort:

static <T> void sort(T[] a, Comparator<? super T> c) {
    sort(a, 0, a.length, c);
}

static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c) {

    // ...

    // If array is small, do a "mini-TimSort" with no merges
    if (nRemaining < MIN_MERGE) {
        int initRunLen = countRunAndMakeAscending(a, lo, hi, c);
        binarySort(a, lo, hi, lo + initRunLen, c);
        return;
    }

    // ...

MIN_MERGE の値は実際には 32 であり、例外をスローするメソッドは他の場合にのみ呼び出されます。

于 2012-11-04T13:01:22.290 に答える
1

エラーコンパレーターにあります (A < B && B < C -> A < C に違反しています) が、TimSort は常に間違っているように見えるスタックトレースをもたらすと思いました。

于 2012-11-04T13:37:42.993 に答える