ホームページ > Java > &#&チュートリアル > Java コンパレーターが「比較メソッドが一般契約に違反しています」エラーをスローするのはなぜですか?

Java コンパレーターが「比較メソッドが一般契約に違反しています」エラーをスローするのはなぜですか?

Barbara Streisand
リリース: 2025-01-04 15:15:39
オリジナル
868 人が閲覧しました

Why Does My Java Comparator Throw a

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート