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)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
oder noch kürzer:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
Diese eine Aussage entspricht der folgenden:
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
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:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
Der obige Code sortiert die Liste zuerst nach timeStarted
und dann nach timeEnded
(für die Datensätze, die denselben haben timeStarted
).
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:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
EDIT: Danke an Lukas Eder, der mich auf die .thenComparing()
Funktion hingewiesen hat .