ホームページ > Java > &#&チュートリアル > 私の Java `compareTo` メソッドが一般契約に違反するのはなぜですか?

私の Java `compareTo` メソッドが一般契約に違反するのはなぜですか?

Susan Sarandon
リリース: 2024-12-15 02:13:17
オリジナル
809 人が閲覧しました

Why Does My Java `compareTo` Method Violate the General Contract?

エラー: Java の CompareTo メソッドが一般規約に違反しています

「Comparison メソッドは一般規約に違反しています」エラーが発生するとイライラすることがあります。広範な調査にも関わらず、多くの開発者がこの問題の解決に苦労しています。

このエラーは、Java でオブジェクトを比較するために使用される CompareTo メソッドが推移性の要件に違反している場合に発生します。推移性により、A が B より大きく、B が C より大きい場合、A は C より大きくなければならないことが決まります。

提供されたコード スニペットでは、CollectionItems のカスタム コンパレーターが実装されていましたが、エラーが含まれていました。推移性の違反。

エラー1:

if (card1.getRarity() < card2.getRarity()) {
  return 1;
}
ログイン後にコピー

ここで、card1.getRarity() がcard2.getRarity() より大きい場合、正しい戻り値は 1 ではなく -1 である必要があります。

エラー 2:

if (card1.getId() == card2.getId()) {
  //...
}
return -1;
ログイン後にコピー

ID が一致しない場合等しい場合、正しい戻り値は、card1.getId() が Card2.getId() より小さい場合は -1、card1.getId() が大きい場合は 1 になります。

改訂されたコンパレータ:

これらのエラーを解決するために、以下に準拠したコンパレータの修正バージョンを次に示します。推移性:

if (card1.getSet() > card2.getSet()) {
    return 1;
}
if (card1.getSet() < card2.getSet()) {
    return -1;
};
if (card1.getRarity() < card2.getRarity()) {
    return 1;
}
if (card1.getRarity() > card2.getRarity()) {
    return -1;
}
if (card1.getId() > card2.getId()) {
    return 1;
}
if (card1.getId() < card2.getId()) {
    return -1;
}
return cardType - item.getCardType();  //watch out for overflow!
ログイン後にコピー

以上が私の Java `compareTo` メソッドが一般契約に違反するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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