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) );
РЕДАКТИРОВАТЬ: Спасибо Lukas Eder за указание мне на функцию .thenComparing()
.