Maison > Java > javaDidacticiel > Erreur du comparateur Java : comment corriger « La méthode de comparaison viole son contrat général » ?

Erreur du comparateur Java : comment corriger « La méthode de comparaison viole son contrat général » ?

Patricia Arquette
Libérer: 2024-12-14 10:07:12
original
351 Les gens l'ont consulté

Java Comparator Error: How to Fix

Erreur Java : dévoilement de la violation du contrat général de la méthode de comparaison

L'erreur "La méthode de comparaison viole son contrat général" se produit lorsqu'un comparateur est défini en Java ne parvient pas à adhérer au principe fondamental de transitivité. Ce principe veut que si l'objet A est supérieur à l'objet B et que l'objet B est supérieur à l'objet C, alors A doit également être supérieur à C.

Pour résoudre cette erreur, il est crucial de s'assurer que l'objet défini le comparateur suit strictement cette règle. Dans l'exemple fourni, le problème réside dans la méthode compareTo(). Plusieurs divergences sont évidentes :

  1. Lors de la comparaison de la rareté des cartes, la méthode ne renvoie pas -1 lorsque card1.getRarity() est supérieur à card2.getRarity().
  2. Lors de la comparaison des cartes ID, la méthode renvoie -1 si les ID ne sont pas égaux, même si elle doit renvoyer -1 ou 1 en fonction du plus grand ID.

Pour rectifier ces erreurs, une version révisée du comparateur est présentée :

public int compareTo(Object o) {
    if (this == o) {
        return 0;
    }

    CollectionItem item = (CollectionItem) o;

    Card card1 = CardCache.getInstance().getCard(cardId);
    Card card2 = CardCache.getInstance().getCard(item.getCardId());

    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!
}
Copier après la connexion

Ce comparateur mis à jour garantit que la méthode de comparaison respecte la règle de transitivité. En corrigeant ces incohérences, l'erreur « La méthode de comparaison viole son contrat général » sera résolue.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal