У меня простой класс
public class ActiveAlarm {
public long timeStarted;
public long timeEnded;
private String name = "";
private String description = "";
private String event;
private boolean live = false;
}
и List<ActiveAlarm>
кон. Как отсортировать в порядке возрастания по timeStarted
, затем по timeEnded
? Кто-нибудь может помочь? Я знаю в C ++ с универсальным алгоритмом и оператором перегрузки <, но я новичок в Java.
java
sorting
sort-object
Дженнифер
источник
источник
Ответы:
Либо сделать
ActiveAlarm
реализовать,Comparable<ActiveAlarm>
либо реализоватьComparator<ActiveAlarm>
в отдельном классе. Затем позвоните:или
В общем, это хорошая идея , чтобы реализовать ,
Comparable<T>
если есть один «естественный» порядок сортировки ... В противном случае (если случится хотите разобраться в определенном порядке, но может одинаково легко хотеть другой) это лучше реализоватьComparator<T>
. Честно говоря, эта конкретная ситуация может пойти в любую сторону ... но я бы, вероятно, выбрал более гибкийComparator<T>
вариант.РЕДАКТИРОВАТЬ: Пример реализации:
источник
a = Long.MIN_VALUE, b = 1
..compare
С помощью
Comparator
Например:
Начиная с Java 8, вы можете просто использовать лямбда-выражение для представления экземпляра Comparator.
источник
compareTo()
? От куда это? Где я должен это определить?getScores()
является добытчиком дляscores
которого являетсяList<Integer>
. Когда выgetScores().get(0)
получаетеInteger
объект.Integer
уже имеетcompareTo(anotherInteger)
Реализованный метод, вы не должны определить.JAVA 8 и выше ответ (с помощью лямбда-выражений)
В Java 8 были введены лямбда-выражения, чтобы сделать это еще проще! Вместо создания объекта Comparator () со всеми его лесами, вы можете упростить его следующим образом: (используя ваш объект в качестве примера)
или даже короче
Это одно утверждение эквивалентно следующему:
Думайте о лямбда-выражениях как о том, что вам нужно только вставить соответствующие части кода: сигнатуру метода и то, что возвращается.
Другая часть вашего вопроса была о том, как сравнивать несколько полей. Чтобы сделать это с помощью лямбда-выражений, вы можете использовать
.thenComparing()
функцию для эффективного объединения двух сравнений в одно:Приведенный выше код отсортирует список сначала по
timeStarted
, а затем поtimeEnded
(для тех записей, которые имеют одинаковыеtimeStarted
).И последнее замечание: легко сравнивать примитивы long или int, вы можете просто вычесть одно из другого. Если вы сравниваете объекты ('Long' или 'String'), я предлагаю вам использовать их встроенное сравнение. Пример:
РЕДАКТИРОВАТЬ: Спасибо Лукас Эдер за указание мне на
.thenComparing()
работу.источник
Comparator.comparing().thenComparing()
...Collections
больше звонить , вы можете позвонить прямо в список. Например:myList.sort(Comparator.comparing(Address::getZipCode).thenComparing(Compartor.comparing(Address::getStreetName));
Мы можем отсортировать список одним из двух способов:
1. Использование компаратора : когда требуется использовать логику сортировки в нескольких местах. Если вы хотите использовать логику сортировки в одном месте, то вы можете написать анонимный внутренний класс следующим образом или же извлечь компаратор и использовать его в нескольких местах.
У нас может быть нулевая проверка свойств, если бы мы могли использовать «Long» вместо «long».
2. Использование Comparable (естественный порядок) : если алгоритм сортировки всегда придерживается одного свойства: напишите класс, который реализует метод Comparable, и переопределите метод compareTo, как определено ниже.
}
вызов метода сортировки для сортировки на основе естественного порядка
источник
В java8 + это можно записать в одну строку следующим образом:
collectionObjec.sort(comparator_lamda)
илиcomparator.comparing(CollectionType::getterOfProperty)
код:
или
источник
Это должно дать вам грубую идею. Как только это будет сделано, вы можете позвонить
Collections.sort()
в список.источник
С Java8 это можно сделать еще чище, используя комбинацию
Comparator
иLambda expressions
Например:
источник
Guava's ComparisonChain :
источник
Вы можете использовать
Collections.sort
и передать свой собственныйComparator<ActiveAlarm>
источник
В Java вы должны использовать статический
Collections.sort
метод. Вот пример списка объектов CompanyRole, отсортированных сначала по началу, а затем по концу. Вы можете легко адаптироваться к своему собственному объекту.источник
Вы можете вызвать Collections.sort () и передать Comparator, который вам нужно написать, чтобы сравнить различные свойства объекта.
источник
Как уже упоминалось, вы можете сортировать по:
Comparable
Comparator
вCollections.sort
Если вы сделаете и то, и другое, оно
Comparable
будет проигнорировано иComparator
будет использовано. Это помогает тому, что у объектов-значений есть своя логическая логика,Comparable
которая наиболее приемлема для вашего объекта-значения, в то время как каждый отдельный вариант использования имеет свою собственную реализацию.источник