pourquoi ma méthode de comparaison jeter l'exception — méthode de Comparaison de la viole son contrat!
Pourquoi ce code
public class SponsoredComparator implements Comparator<SRE> {
public boolean equals(SRE arg0, SRE arg1){
return arg0.getSponsored()==arg1.getSponsored();
}
public int compare(SRE object1, SRE object2) {
Log.d("SponsoredComparator","object1.getName() == "+ object1.getName());
Log.d("SponsoredComparator","object1.getSponsored() == "+ object1.getSponsored());
Log.d("SponsoredComparator","object2.getName() == "+ object2.getName());
Log.d("SponsoredComparator","object2.getSponsored() == "+ object2.getSponsored());
Log.d("SponsoredComparator","compare return == "+ (object1.getSponsored() && object2.getSponsored() ? 0 : object1.getSponsored() ? -1 : 1));
return object1.getSponsored() && object2.getSponsored() ? 0 : object1.getSponsored() ? -1 : 1;
}
}
lever cette exception: ERROR/AndroidRuntime(244): java.lang.IllegalArgumentException: Comparison method violates its general contract!
ERROR/AndroidRuntime(4446): at java.util.TimSort.mergeLo(TimSort.java:743)
La méthode de la sre.getSponsored() renvoie un booléen.
Grâce.
OriginalL'auteur lost baby | 2011-07-08
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que le problème se produit lorsque ni valeur est parrainé. Qui sera de retour 1 selon la manière dont vous l'appelez, c'est à dire
Qui est invalide.
Je vous suggère de changer cela:
à
dans les deux endroits. Je serais probablement fait extrait présente une méthode avec cette signature quelque part:
et ensuite appeler comme ceci:
Qui permettra de rendre le code plus clair, de l'OMI.
Et ce n'est pas directement lié à la question que vous êtes en train de vivre, mais vous ne avez plus à vous soucier de zéros?
OriginalL'auteur Jon Skeet
Je suppose que vous utilisez le JDK 7. Vérifiez l'URL suivante:
De http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source
Pour de plus amples informations, voir la base de données de bogues référence ici.
TimSort
algorithme qui jetteIllegalArgumentException
si utilisé avecComparable
qui viole laComparable
contrat.merci pour le partage.
OriginalL'auteur naresh
Le contrat entre equals() et compareTo (), c'est que lorsque equals() renvoie true, compareTo() doit retourner 0 et quand equals() est faux compareTo doit retourner -1 ou +1.
BTW: je suppose que votre méthode compare() n'est pas appelée très souvent que les messages de débogage va utiliser un signficiant quantité de CPU et de mémoire.
la documentation dit "Il est fortement recommandé, mais n'est pas strictement nécessaire que (x.compareTo(y)==0) == (x.equals(y))". Et cette exception à partir de la question n'est pas dérivé de rupture de contrat avec la méthode equals. J'écris ce commentaire sur ce vieux répondre car il me mène à des conclusions erronées que la rupture de contrat dans cette exception peut être connecté avec la méthode equals
Lawrey C'est la première information que j'ai trouvé où quelqu'un a fait clair, que le contrat est vraiment. Merci pour cela, Mais étant donné que est égal à a de redonner une valeur qui correspond à compareTo, je pense que la meilleure solution pour tous les utilisateurs de la mise en œuvre de compareTo pourrait être de remplacer également d'égal à égal et appelant simplement compareTo à l'intérieur de cette méthode, qui renvoie true si le résultat est 0 et false si elle n'est pas 0. La seule chose qui doit être considéré est, que dans compareTo il ne doit pas être un appel à égal.
À l'aide de compareTo a quelques problèmes;) parfois deux valeurs peuvent être égaux, mais compareTo n'est pas de 0 par exemple -0.0 0.0 et BigDecimal valeurs. L'autre problème est que les deux valeurs peut ne pas avoir de raisonnable notion de plus ou de moins, pas vous pouvez vérifier l'égalité.
Lawrey je pense que compareTo peut être utilisé sans aucun problème. Il a travaillé pour moi pendant des années jusqu'à ce que le java Équipe a décidé qu'une violation du contrat entre compareTo et est égal à lancer une exception, qui n'a pas vraiment clarifier ce que l'on va mal. J'utilise compareTo rarement, mais c'est une méthode pratique pour comparer deux instances d'une classe à décider ce qui doit être triés avant l'autre. Après avoir à connaître les détails du contrat, la correction de bug pour que l'exception était vraiment facile et fonctionne comme un charme.
OriginalL'auteur Peter Lawrey
Je suis d'accord avec toutes les réponses spécialement avec jon, mais un addinal choses, je veux dire que nous devons toujours vérifier la nullité de la sécurité dans la méthode de comparaison, de sorte que notre méthode ne jamais être en rupture et c'est une bonne habitude de programmation pour toujours null vérification. Pour plus d'info regarder ici
OriginalL'auteur kailash gaur
peut-être vous avez juste NaN valeurs qui vous comparer à travers les Collections.trier... cela a été un problème pour moi et j'ai obtenu une exception même avoir droit à la mise en œuvre de comparer(obj1, obj2) méthode! Vérifier que!
OriginalL'auteur
J'ai eu le même problème aujourd'hui, dans une application web. Quatre appels à travailler sur le même tableau essayé de faire le tri dans le même temps, effectivement gâcher les uns les autres.
OriginalL'auteur Bjarne Havnen
Quand je veux trier les nombres et un élément de tableau est nul, j'ai mis 0 alors l'erreur disparaît. Cela est nécessaire pour s'assurer que la taille de chaque ligne dans les tableaux à deux dimensions sont les mêmes.
OriginalL'auteur Eduardo Enrique Lopez Saucedo