Ich habe eine Klasse, in der ich eine Liste sortiere.
%Vor%Nachdem das Programm ausgeführt wurde, erhalte ich folgende Werte:
%Vor%Meine Frage ist, was ist das Verhalten der Collection.sort () -Funktion hier. Bei der Rückgabe von -1 aus der Vergleichsfunktion erhalten wir die umgekehrte Reihenfolge der Liste. Wie können wir andere Sortieraufträge bekommen? Welche Rolle spielt die Rückgabe von 0 und 1?
Schließlich habe ich die Sortierfunktion auf diese Weise modifiziert, um sortierte Daten zu erhalten.
%Vor%Hier ist was das Javadoc sagt:
int vergleichen (T o1, T o2)
Vergleicht seine beiden Argumente für die Reihenfolge. Gibt eine negative ganze Zahl, eine Null oder eine positive ganze Zahl zurück, da das erste Argument kleiner als, gleich ist zu oder größer als der zweite.
Ihre Komparator-Implementierung respektiert diesen Vertrag nicht, daher ist das Ergebnis unbestimmt. Es muss einen negativen Wert zurückgeben, wenn o1 kleiner als o2 ist. Es muss einen positiven Wert zurückgeben, wenn es o1 als größer als o2 ansieht. Und es muss 0 zurückgeben, wenn es annimmt, dass o1 gleich o2 ist. Und es muss natürlich konsistent sein. Wenn o1 & lt; o2, dann o2 & gt; o1. Wenn o1 & lt; o2 und o2 & lt; o3, dann o1 & lt; o3.
java.util.Comparator
class sagt in compare
method java doc:
eine negative ganze Zahl, Null oder eine positive ganze Zahl als erstes Argument ist kleiner als, gleich oder größer als das Sekunde.
Sie können folgenden Code verwenden:
%Vor%Dieser Code muss funktionieren. Sie können die Vergleichsmethode für mehr Flexibilität ändern.
compareTo
Methode in String
Klasse sagt in seinem Java-Dokument:
Der Wert
0
, wenn die Argument-Zeichenfolge gleich ist diese Zeichenfolge; Ein Wert kleiner als0
wenn diese Zeichenfolge ist lexikographisch kleiner als das String-Argument; und ein Wert größer als0
, wenn diese Zeichenfolge ist Lexikographisch größer als das String-Argument.
Was ist die Rolle der Rückgabe von 0 und 1?
Es ist zu sagen, dass o1 gleich o2 oder o1 größer als o2 ist.
Ihr anonymer Komparator sagt derzeit, dass o1 kleiner als o2 ist, für jeden möglichen Wert von o1
und o2
. Dies macht einfach keinen Sinn und verursacht das Verhalten von sort
unvorhersehbar.
Ein gültiger -Komparator muss die compare(Object, Object)
-Methode implementieren, damit sie sich entsprechend den Anforderungen der Comparator
-Schnittstelle verhält.
Wenn Ihr Ziel ist, die Reihenfolge der Elemente in einer Liste umzukehren, verwenden Sie nicht sort
. Verwende Collections.reverse()
von Javadoc of Comparator
%Vor%Definieren Sie also die Funktionalität kleiner als, gleich oder größer als für Ihre Klasse, Ihnen fehlt die Funktionalität gleich und größer als die Funktionalität.