私のJavaコードは次の例外をスローしました:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
私は StackOverflow でメッセージを調査し、不十分に記述された比較メソッドを投稿したいくつかの質問を見つけましたが、コントラクトがどこに記述されているのか、そして比較メソッドが何をしなければならないかについて正確に何を述べているのか疑問に思っていました。
私のJavaコードは次の例外をスローしました:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
私は StackOverflow でメッセージを調査し、不十分に記述された比較メソッドを投稿したいくつかの質問を見つけましたが、コントラクトがどこに記述されているのか、そして比較メソッドが何をしなければならないかについて正確に何を述べているのか疑問に思っていました。
Java Docにあるようです
実装者は、すべての x と y に対して sgn(compare(x, y)) == -sgn(compare(y, x)) であることを確認する必要があります。(これは、compare(y, x) が例外をスローする場合にのみ、compare(x, y) が例外をスローする必要があることを意味します。)
実装者は、関係が推移的であることも確認する必要があります: ((compare(x, y)>0) && (compare(y, z)>0)) は、compare(x, z)>0 を意味します。
最後に、実装者は、compare(x, y)==0 がすべての z に対して sgn(compare(x, z))==sgn(compare(y, z)) を意味することを確認する必要があります。
一般的にはそうですが、厳密には (compare(x, y)==0) == (x.equals(y)) である必要はありません。一般に、この条件に違反するコンパレータは、この事実を明確に示す必要があります。推奨される言語は、「注: このコンパレータは、equals と矛盾する順序付けを課します。」