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
).
И последнее замечание: легко сравнивать примитивы long или int, вы можете просто вычесть одно из другого. Если вы сравниваете объекты ('Long' или 'String'), я предлагаю вам использовать их встроенное сравнение. Пример:
Collections.sort(list, (ActiveAlarm a1, ActiveAlarm a2) -> a1.name.compareTo(a2.name) );
РЕДАКТИРОВАТЬ: Спасибо Лукас Эдер за указание мне на .thenComparing()
работу.