5

java7にソートの問題はありますか? Collections.sort(list, comparison) を使用しています

java7 に切り替えたとき、並べ替えの結果が、java6 を使用していたときとは異なるリストになっていることに気付きました。

例: リスト = [d、e、b、a、c、f、g、h]

java6 Collections.sort(List, comparison) では [a, b, c, d, e, f, g, h] という結果になりました

java7 Collections.sort(List, comparison) では [b, a, c, d, e, f, g, h] という結果になりました

リストの最初の 2 つの値が入れ替わっています。

4

2 に答える 2

9

Java 7 はMerge sortからTim sortに切り替わりました。「壊れたコンパレータ」で順序がわずかに変更される可能性があります(Arraysクラスのソースコードのコメントを引用):

/**
 * Old merge sort implementation can be selected (for
 * compatibility with broken comparators) using a system property.
 * Cannot be a static boolean in the enclosing class due to
 * circular dependencies. To be removed in a future release.
 */

以下を使用して JVM を実行してみてください。

java -Djava.util.Arrays.useLegacyMergeSort=true

「壊れたコンパレータ」が何を意味するのかは明確ではありませんが、ソートされた配列の要素の順序が異なる可能性があるようです。

于 2012-12-07T18:37:52.083 に答える
0

混乱を招く可能性があることに注意してください。Collections.sort は安定したソートです。これは、等しい要素の場合、元の順序を維持することを意味します。

a == b の場合、

Collections.sort([d, e, b, a, c, f, g, h]) = [b, a, c, d, e, f, g, h]

Collections.sort([d, e, a, b, c, f, g, h]) = [a, b, c, d, e, f, g, h]

それがあなたの見ているものであるか、問題の Comparator (またはソートされているオブジェクトの自然な順序付け) が期待どおりに機能していないように思えます。

于 2012-12-07T18:48:17.333 に答える