Réponse JAVA 8 et ci-dessus (à l'aide d'expressions Lambda)
Dans Java 8, des expressions Lambda ont été introduites pour rendre cela encore plus facile! Au lieu de créer un objet Comparator () avec tout son échafaudage, vous pouvez le simplifier comme suit: (en utilisant votre objet comme exemple)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
ou même plus court:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
Cette déclaration équivaut à ce qui suit:
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
Considérez les expressions Lambda comme vous obligeant uniquement à insérer les parties pertinentes du code: la signature de la méthode et ce qui est renvoyé.
Une autre partie de votre question était de savoir comment comparer avec plusieurs champs. Pour ce faire avec les expressions Lambda, vous pouvez utiliser la .thenComparing()
fonction pour combiner efficacement deux comparaisons en une:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
Le code ci-dessus triera la liste d'abord par timeStarted
, puis par timeEnded
(pour les enregistrements qui ont le même timeStarted
).
Une dernière remarque: il est facile de comparer les primitives «long» ou «int», vous pouvez simplement soustraire l'une de l'autre. Si vous comparez des objets («Long» ou «String»), je vous suggère d'utiliser leur comparaison intégrée. Exemple:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
EDIT: Merci à Lukas Eder de m'avoir indiqué .thenComparing()
fonctionner.