Ich habe einfache Klasse
public class ActiveAlarm {
public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;
}
und List<ActiveAlarm>
con. Wie sortiere ich in aufsteigender Reihenfolge nach timeStarted
, dann nach timeEnded
? Kann jemand helfen? Ich kenne mich in C ++ mit generischem Algorithmus und Überladungsoperator <aus, bin aber neu in Java.
java
sorting
sort-object
Jennifer
quelle
quelle
Antworten:
Entweder
ActiveAlarm
implementierenComparable<ActiveAlarm>
oderComparator<ActiveAlarm>
in einer separaten Klasse implementieren . Dann ruf an:oder
Im Allgemeinen ist es eine gute Idee, sie zu implementieren,
Comparable<T>
wenn es eine einzige "natürliche" Sortierreihenfolge gibt. Andernfalls (wenn Sie zufällig in einer bestimmten Reihenfolge sortieren möchten, aber genauso leicht eine andere möchten) ist es besser, sie zu implementierenComparator<T>
. Diese besondere Situation könnte in beide Richtungen gehen, um ehrlich zu sein ... aber ich würde wahrscheinlich bei der flexiblerenComparator<T>
Option bleiben .EDIT: Beispielimplementierung:
quelle
a = Long.MIN_VALUE, b = 1
..compare
Verwenden von
Comparator
Beispielsweise:
Ab Java 8 können Sie einfach den Lambda-Ausdruck verwenden, um die Comparator-Instanz darzustellen.
quelle
compareTo()
das Woher kommt das? Wo muss ich es definieren?getScores()
ist der Getter, fürscores
den aList<Integer>
. Wenn Sie dies tun, erhaltengetScores().get(0)
Sie einInteger
Objekt.Integer
Ist diecompareTo(anotherInteger)
Methode bereits implementiert, müssen Sie sie nicht definieren.JAVA 8 und höher Antwort (mit Lambda-Ausdrücken)
In Java 8 wurden Lambda-Ausdrücke eingeführt, um dies noch einfacher zu machen! Anstatt ein Comparator () -Objekt mit seinem gesamten Gerüst zu erstellen, können Sie es wie folgt vereinfachen: (Verwenden Sie Ihr Objekt als Beispiel)
oder noch kürzer:
Diese eine Aussage entspricht der folgenden:
Stellen Sie sich Lambda-Ausdrücke so vor, dass Sie nur die relevanten Teile des Codes eingeben müssen: die Methodensignatur und das, was zurückgegeben wird.
Ein weiterer Teil Ihrer Frage war, wie Sie mit mehreren Feldern vergleichen können. Um dies mit Lambda-Ausdrücken zu tun, können Sie die
.thenComparing()
Funktion verwenden, um zwei Vergleiche effektiv zu einem zu kombinieren:Der obige Code sortiert die Liste zuerst nach
timeStarted
und dann nachtimeEnded
(für die Datensätze, die denselben habentimeStarted
).Ein letzter Hinweis: Es ist einfach, "lange" oder "int" Grundelemente zu vergleichen. Sie können einfach eines vom anderen subtrahieren. Wenn Sie Objekte vergleichen ('Long' oder 'String'), empfehle ich Ihnen, deren integrierten Vergleich zu verwenden. Beispiel:
EDIT: Danke an Lukas Eder, der mich auf die
.thenComparing()
Funktion hingewiesen hat .quelle
Comparator.comparing().thenComparing()
...Collections
mehr anrufen , Sie können direkt auf die Liste anrufen. Zum Beispiel:myList.sort(Comparator.comparing(Address::getZipCode).thenComparing(Compartor.comparing(Address::getStreetName));
Wir können die Liste auf zwei Arten sortieren:
1. Verwenden des Komparators : Wenn erforderlich, um die Sortierlogik an mehreren Stellen zu verwenden Wenn Sie die Sortierlogik an einer einzigen Stelle verwenden möchten, können Sie eine anonyme innere Klasse wie folgt schreiben oder den Komparator extrahieren und an mehreren Stellen verwenden
Wir können die Eigenschaften auf Null prüfen lassen, wenn wir 'Long' anstelle von 'long' hätten verwenden können.
2. Verwenden von Comparable (natürliche Reihenfolge) : Wenn der Sortieralgorithmus immer an einer Eigenschaft festhält: Schreiben Sie eine Klasse, die 'Comparable' implementiert, und überschreiben Sie die 'compareTo'-Methode wie unten definiert
}}
Rufen Sie die Sortiermethode auf, um nach natürlicher Reihenfolge zu sortieren
quelle
In Java8 + kann dies wie folgt in einer Zeile geschrieben werden:
collectionObjec.sort(comparator_lamda)
odercomparator.comparing(CollectionType::getterOfProperty)
Code:
oder
quelle
Das sollte Ihnen eine ungefähre Vorstellung geben. Sobald dies erledigt ist, können Sie
Collections.sort()
die Liste aufrufen .quelle
Seit Java8 kann dies mit einer Kombination aus
Comparator
und noch sauberer gemacht werdenLambda expressions
Beispielsweise:
quelle
Guavas Vergleichskette :
quelle
Sie können
Collections.sort
Ihre eigenen verwenden und weitergebenComparator<ActiveAlarm>
quelle
In Java müssen Sie die statische
Collections.sort
Methode verwenden. Hier ist ein Beispiel für eine Liste von CompanyRole-Objekten, die zuerst nach Anfang und dann nach Ende sortiert sind. Sie können sich leicht an Ihr eigenes Objekt anpassen.quelle
Sie können Collections.sort () aufrufen und einen Komparator übergeben, den Sie schreiben müssen, um verschiedene Eigenschaften des Objekts zu vergleichen.
quelle
Wie bereits erwähnt, können Sie sortieren nach:
Comparable
Comparator
anCollections.sort
Wenn Sie beides tun,
Comparable
wird das ignoriert undComparator
verwendet. Dies hilft, dass die Wertobjekte eine eigene Logik haben,Comparable
die für Ihr Wertobjekt am sinnvollsten ist, während jeder einzelne Anwendungsfall seine eigene Implementierung hat.quelle