Відповідь JAVA 8 і вище (використовуючи лямбдаські вирази)
У Java 8 були введені лямбдаські вирази, щоб зробити це ще простіше! Замість того, щоб створювати об’єкт Comparator () з усіма його лісами, ви можете спростити його наступним чином: (Використовуючи об'єкт як приклад)
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted);
або навіть коротше:
Collections.sort(list, Comparator.comparingInt(ActiveAlarm ::getterMethod));
Це одне твердження еквівалентно наступному:
Collections.sort(list, new Comparator<ActiveAlarm>() {
@Override
public int compare(ActiveAlarm a1, ActiveAlarm a2) {
return a1.timeStarted - a2.timeStarted;
}
});
Подумайте про вирази лямбда як лише про те, що потрібно ввести відповідні частини коду: підпис методу та те, що повертається.
Інша частина вашого запитання полягала в тому, як порівняти кілька полів. Для цього за допомогою лямбдаських виразів ви можете використовувати .thenComparing()
функцію для ефективного поєднання двох порівнянь в одне:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.timeStarted-a2.timeStarted
.thenComparing ((ActiveAlarm a1, ActiveAlarm a2) -> a1.timeEnded-a2.timeEnded)
);
Вищенаведений код буде сортувати список спочатку за timeStarted
, а потім за timeEnded
(для тих записів, які мають однаковий timeStarted
).
Останнє зауваження: порівняти «довгі» чи «інтитні» примітиви легко. Ви можете просто відняти один від іншого. Якщо ви порівнюєте об'єкти ("Довгий" або "Рядок"), я пропоную вам використовувати їх вбудоване порівняння. Приклад:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
EDIT: Дякую Лукашу Едеру за те, що він вказав на мене .thenComparing()
.