2016-03-29 11 views
0

カスタムコンパレータでCollections.sortカスタムコンパレータを持つCollections.sort()は、すべてのペア(a、b)の比較(a、b)と比較(b、a)を行いますか

java.lang.IllegalArgumentException: Comparison method violates its general contract! 

このエラーについてグーグルで後comapareは、(a、b)は私を与えた場合、私が言ったいくつかの説明を参照してください-1と比較(bは、a)のも、私は-1、私はこのエラーが表示されます提供します。

なぜ2回比較しているのか分かりません。

+1

コンパレータを修正するだけです。 'compare'呼び出しの正確なシーケンスを調べることで、ソートルーチンがあなたを助けることはありません。ソートは出力がソートされていればどんな比較をしてもかまいません。さまざまなJavaのバージョンと実装では異なる処理が行われます。 – user2357112

+0

私はコンパレータに問題があることを理解しています。私はちょうど各ペアの比較が2回以上起こるかどうかを理解しようとしています – user3344591

+0

それはすべてのペアで起こることはありません。それはO(n^2)の比較であり、Collections.sortはO(n log n)です。 –

答えて

0

JavaDoc of Comparable's compareTo()

実装は、すべてのxおよびyのSGN(x.compareTo(Y))== -sgn(y.compareTo(X))を保証しなければなりません。これは、y.compareTo(x)が例外をスローする場合、x.compareTo(y)が例外をスローする必要があることを意味する。

実装者は、関係が推移的であることも保証しなければならない。(x.compareTo(y)> 0 & & y.compareTo(z)> 0)は、x.compareTo(z)> 0を意味する。

最終的に、実装者は、すべてのzに対して、x.compareTo(y)== 0がsgn(x.compareTo(z))== sgn(y.compareTo(z)簡単な言葉で

、それは次のことを意味します。

  • x.compareTo(y)が例外をスローした場合、y.compareTo(x)は例外をスローする必要があります。
  • x > yた場合、およびy > z、その後、x > z
  • x.compareTo(y) == 0場合、x.compareTo(z)y.compareTo(z)は同じ符号を持つ必要があります。

簡潔に:a == bの場合は、b == aです。もしそうでなければ、あなたは契約に違反しています。

0

Java 1.8の時点で、はに作業を渡し、TimSortに作業を渡します。 Here's a link to the API and code used for that algorithm.

非常に乱雑で複雑です(いい理由では、ソートアルゴリズムを最適化することが重要です)。要素の各ペアが1回だけ比較されることを保証する(または示唆することはありません)。たいていはO(n * logn)の比較を保証しますが、一意の比較はしません。

関連する問題