Java Collections Sortieren: Vergleich Methode verstösst gegen die Allgemeinen Vertrags

Ich weiß, es wurde gefragt und beantwortet Millionen von Zeiten, aber immer noch ich bin nicht in der Lage, herauszufinden, warum ich am Empfang mit der Verletzung beim Sortieren. Hier ist mein code:

Collections.sort(sorted, new Comparator<MyObject>() {
    @Override
    public int compare(MyObject m1, MyObject m2) {
        //Actual energy comparison :-
        //THE higher the energy, the earlier in the list
        float delta = m1.getTotalEnergy() - m2.getTotalEnergy();

        if (delta > 0) {
            return 1;
        } else if (delta < 0) {
            return -1;
        } else {
            return 0;
        }
    }
});

und ich erhalte diese Fehlermeldung

java.lang.IllegalArgumentException: Comparison method violates its general contract!  
        at java.util.TimSort.mergeHi(TimSort.java:895)  
        at java.util.TimSort.mergeAt(TimSort.java:512)  
        at java.util.TimSort.mergeForceCollapse(TimSort.java:453)  
        at java.util.TimSort.sort(TimSort.java:250)  
        at java.util.Arrays.sort(Arrays.java:1512)  
        at java.util.ArrayList.sort(ArrayList.java:1454)  
        at java.util.Collections.sort(Collections.java:175)

Irgendwelche Ideen ?

Bitte formatieren Sie den stacktrace
Andere threads ändern Sie den Wert von totalEnergy, während die Sortierung läuft?
mögliche Duplikate von "Comparison method violates its general contract!"
Sie könnten einfach verwenden: return Float.vergleichen(m1.getTotalEnergy(), m2.getTotalEnergy());
Ich habe kopiert diesen code und es macht seinen job ohne Probleme. Können Sie bitte zeigen Sie uns die input-Daten, und geben Sie die "sortiert" - Kollektion? Wie eine minimale reproduzierbare Beispiel?

InformationsquelleAutor math_law | 2015-01-17

Schreibe einen Kommentar