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
Patricia Arquetteoriginal
2024-12-14 10:07:12353parcourir

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!
}

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!

Déclaration:
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