Java エラー: 「比較メソッドが一般規約に違反しています」
コレクションをソートするとき、Java は比較メソッドを利用してオブジェクトの順序を確立します。ただし、この方法は、オブジェクト A が B より大きく、B が C より大きい場合、A は C より大きい必要があるという推移性の原則に従う必要があります。特定の状況では、この規約に違反する可能性があり、「比較メソッドは一般規約に違反しています。」エラー。
例
に基づいてオブジェクトを並べ替えることを目的とした次のカスタム コンパレータを考えてみましょう。特定の基準に基づいて。ただし、論理的な矛盾により、推移性ルールに違反します。
@Override public int compareTo(Object o) { ... if (card1.getRarity() < card2.getRarity()) { return 1; } ... if (card1.getSet() > card2.getSet()) { return -1; } ... }
推移性の問題
上記の例では、card1.getRarity() が決定的なものである場合、係数があり、card1.getRarity() がcard2.getRarity() より小さい場合、コンパレータは正しく返します。 1. ただし、card2.getSet() が決定要因で、card2.getSet() が Card1.getSet() より小さい場合、コンパレータは誤って -1 を返します。これにより、非推移的な状況が発生します。
正しい解決策
推移性を確保するには、コンパレータは次のロジックに従う必要があります:
if (card1.getRarity() < card2.getRarity()) { return 1; } if (card1.getRarity() > card2.getRarity()) { return -1; } ...
要約すると、「比較メソッドは一般規約に違反しています」というエラーを回避するには、比較メソッドが推移性に従っていることを確認してください。 原理。このルールは、オブジェクト A が B より大きく、B が C より大きい場合、A は C より大きい必要があることを示します。推移性を確保することで、一貫した正しい並べ替え動作が保証されます。
以上がJava コンパレーターが「比較メソッドが一般契約に違反しています」エラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。