Maison > Java > javaDidacticiel > Pourquoi mon comparateur Java génère-t-il une erreur « La méthode de comparaison viole son contrat général » ?

Pourquoi mon comparateur Java génère-t-il une erreur « La méthode de comparaison viole son contrat général » ?

Barbara Streisand
Libérer: 2025-01-04 15:15:39
original
935 Les gens l'ont consulté

Why Does My Java Comparator Throw a

Erreur Java : "La méthode de comparaison viole son contrat général"

Lors du tri des collections, Java utilise une méthode de comparaison pour établir l'ordre des objets. Cependant, cette méthode doit respecter le principe de transitivité, qui stipule que si l'objet A est supérieur à B et que B est supérieur à C, alors A doit être supérieur à C. Dans certaines circonstances, ce contrat peut être violé, conduisant à la " La méthode de comparaison viole son erreur de contrat général.

Exemple

Considérons le comparateur personnalisé suivant, destiné à trier les objets en fonction de critères spécifiques. critères. Cependant, en raison d'incohérences logiques, il viole la règle de transitivité :

@Override
public int compareTo(Object o) {
    ...
    if (card1.getRarity() < card2.getRarity()) {
        return 1;
    }
    ...
    if (card1.getSet() > card2.getSet()) {
        return -1;
    }
    ...
}
Copier après la connexion

Problème de transitivité

Dans l'exemple ci-dessus, si card1.getRarity() est le facteur décisif facteur et card1.getRarity() est inférieur à card2.getRarity(), le comparateur renvoie correctement 1. Cependant, si card2.getSet() est le facteur décisif et card2.getSet() est inférieur à card1.getSet(), le comparateur renvoie incorrectement -1. Il en résulte une situation non transitive.

Solution correcte

Pour assurer la transitivité, le comparateur doit adhérer à la logique suivante :

if (card1.getRarity() < card2.getRarity()) {
    return 1;
}
if (card1.getRarity() > card2.getRarity()) {
    return -1;
}
...
Copier après la connexion

En résumé, pour éviter l'erreur « La méthode de comparaison viole son contrat général », assurez-vous que votre méthode de comparaison adhère au principe de transitivité. Cette règle veut que si l'objet A est supérieur à B et que B est supérieur à C, alors A doit être supérieur à C. En assurant la transitivité, vous garantissez un comportement de tri cohérent et correct.

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