warum funktioniert meine Methode vergleichen Ausnahme auslösen — Vergleich Methode verstösst gegen die Allgemeinen Vertrags!
Warum funktioniert dieser 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;
}
}
werfen dieser Ausnahme: ERROR/AndroidRuntime(244): java.lang.IllegalArgumentException: Comparison method violates its general contract!
ERROR/AndroidRuntime(4446): at java.util.TimSort.mergeLo(TimSort.java:743)
Die Methode sre.getSponsored() gibt einen booleschen Wert zurück.
Dank.
InformationsquelleAutor der Frage lost baby | 2011-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, das problem tritt auf, wenn weder Wert ist, gesponsert. Dass gibt 1 zurück, egal, wie Sie es nennen, d.h.
Ist ungültig.
Ich schlage vor, Sie ändern diese:
zu
in beiden Orten. Ich würde wahrscheinlich eigentlich Auszug aus einer Methode mit dieser Signatur irgendwo:
und dann rufen Sie es wie folgt:
Macht den code übersichtlicher, IMO.
InformationsquelleAutor der Antwort Jon Skeet
Ich nehme an, Sie sind mit dem JDK 7. Überprüfen Sie die folgende URL:
Vom http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source
Weitere detaillierte Informationen finden Sie in der bug-Datenbank Referenz hier.
InformationsquelleAutor der Antwort naresh
Vertrag zwischen equals() und compareTo() ist, dass wenn equals() gibt true zurück, compareTo() soll 0 zurückgeben, und wenn equals() ist false compareTo sollte return -1 oder +1.
BTW: ich nehme an, Ihr compare () - Methode nicht aufgerufen wird sehr oft als die debug-Meldungen werden bis eine signficiant Menge an CPU und Speicher.
InformationsquelleAutor der Antwort Peter Lawrey
Ich einig mit allen Antworten speziell mit jon, aber man addinal Dinge will ich sagen, dass wir sollten immer überprüfen, für die null Sicherheit in der compare-Methode so, dass unsere Methode nie brechen und es ist eine gute Gewohnheit, die in die Programmierung für immer auf null prüfen. Für mehr info schauen Sie hier
InformationsquelleAutor der Antwort kailash gaur
vielleicht ist Sie nur noch NaN-Werte, die Sie vergleichen durch die Sammlungen.Sortieren... dies war ein problem für mich und ich habe die Ausnahme auch mit Recht Implementierung von compare(obj1, obj2) - Methode! Prüfen, dass!
InformationsquelleAutor der Antwort
Ich hab das gleiche problem heute in einer web-Anwendung. Vier Anrufe auf demselben array versucht Art es gleichzeitig effektiv vermasselt für jeden anderen.
InformationsquelleAutor der Antwort Bjarne Havnen
Wenn ich zu sortierende zahlen und ein array-element null ist, setze ich 0, dann ist der Fehler verschwindet. Dies ist erforderlich, um zu gewährleisten, dass die Größen der jede Zeile in die zwei-dimensionale arrays sind gleich.
InformationsquelleAutor der Antwort Eduardo Enrique Lopez Saucedo