Java-Sortierung mit anonymer Klasse

8

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?

    
Osman Khalid 20.05.2012, 06:30
quelle

6 Antworten

8

Schließlich habe ich die Sortierfunktion auf diese Weise modifiziert, um sortierte Daten zu erhalten.

%Vor%     
Osman Khalid 20.05.2012, 16:09
quelle
6

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.

    
JB Nizet 20.05.2012 06:35
quelle
4

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 als 0 wenn diese Zeichenfolge                ist lexikographisch kleiner als das String-Argument; und ein                 Wert größer als 0 , wenn diese Zeichenfolge ist                 Lexikographisch größer als das String-Argument.

    
MJM 20.05.2012 06:45
quelle
4
  

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

    
Stephen C 20.05.2012 06:35
quelle
4

Sie können die anonyme Klasse folgendermaßen verwenden:

%Vor%     
Saurabh 03.07.2015 13:20
quelle
1

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.

    
Balaswamy Vaddeman 20.05.2012 06:37
quelle

Tags und Links