Я читал о сортировке ArrayLists с помощью Comparator, но во всех примерах, compareTo
которые использовали люди, согласно некоторым исследованиям, это метод для строк.
Я хотел отсортировать ArrayList пользовательских объектов по одному из их свойств: объекту Date ( getStartDay()
). Обычно я сравниваю их, item1.getStartDate().before(item2.getStartDate())
поэтому мне было интересно, могу ли я написать что-то вроде:
public class CustomComparator {
public boolean compare(Object object1, Object object2) {
return object1.getStartDate().before(object2.getStartDate());
}
}
public class RandomName {
...
Collections.sort(Database.arrayList, new CustomComparator);
...
}
java
sorting
date
comparator
Самуил
источник
источник
Ответы:
Поскольку
Date
реализуетComparable
, у него естьcompareTo
метод, как иString
делает.Так что ваш обычай
Comparator
может выглядеть так:compare()
Метод должен возвращатьint
, так что вы не могли непосредственно возвращать ,boolean
как вы планировали в любом случае.Ваш код сортировки будет примерно таким, как вы написали:
Немного более короткий способ написать все это, если вам не нужно повторно использовать ваш компаратор, это написать его как встроенный анонимный класс:
поскольку Java-8
Теперь вы можете написать последний пример в более короткой форме, используя лямбда-выражение для
Comparator
:И
List
естьsort(Comparator)
метод, так что вы можете сократить это еще дальше:Это настолько распространенная идиома, что есть встроенный метод для генерации
Comparator
класса сComparable
ключом:Все это эквивалентные формы.
источник
int
и что вам лучше использоватьDate#compareTo()
для этого. Почему об этом не говорится выше, другой ответ мне не подходит. Эта ссылка также может быть полезна: Учебник по упорядочению объектов на Sun.com .List.sort()
.Классы, которые имеют естественный порядок сортировки (класс Number, в качестве примера), должны реализовывать интерфейс Comparable, в то время как классы, не имеющие естественного порядка сортировки (класс Chair, в качестве примера), должны быть снабжены Comparator (или анонимным Comparator учебный класс).
Два примера:
Применение:
источник
public
передclass
.Для сортировки
ArrayList
вы можете использовать следующий фрагмент кода:источник
Да, ты можешь. Существует два варианта сравнения элементов: интерфейс Comparable и интерфейс Comparator .
Оба этих интерфейса допускают различное поведение. Comparable позволяет вам заставить объект действовать так, как вы только что описали Strings (фактически String реализует Comparable). Второй, Comparator, позволяет вам делать то, что вы просите. Вы бы сделали это так:
Это заставит метод Collections.sort использовать ваш компаратор для механизма сортировки. Если объекты в ArrayList реализуют сравнимо, вы можете вместо этого сделать что-то вроде этого:
Класс Collections содержит ряд этих полезных, общих инструментов.
источник
JAVA 8 лямбда-выражение
ИЛИ
источник
Collections.sort(studList, Comparator.comparing(Student::getFirstName));
studList.sort(Comparator.comparing(Student::getFirstName));
В Java 8 вы можете использовать ссылку на метод для вашего компаратора:
источник
Поскольку технологии появляются каждый день, ответ со временем изменится. Я посмотрел на LambdaJ и, кажется, очень интересно.
Вы можете попробовать решить эти задачи с LambdaJ . Вы можете найти это здесь: http://code.google.com/p/lambdaj/
Вот вам пример:
Сортировать Итеративный
Сортировка с лямбда
Конечно, такая красота влияет на производительность (в среднем в 2 раза), но можете ли вы найти более читаемый код?
источник
источник
Лучший простой способ с JAVA 8 для английского алфавита
Реализация класса
Сортировать
Если вы хотите отсортировать по алфавиту, который содержит не английские символы, вы можете использовать Locale ... Ниже кода используйте турецкую сортировку символов ...
Реализация класса
Сортировать
источник
Справочник по функциям и методам
Collections.sort
Метод сортировки сList
помощьюComparator
вы проходите. ЭтоComparator
может быть реализовано с использованиемComparator.comparing
метода, где вы можете передать ссылку на метод по мере необходимостиFunction
. К счастью, реальный код намного проще и короче, чем это описание.Для Java 8:
или
Другой способ
источник
От
Java 8
и далее мы не должны использоватьCollections.sort()
напрямую.List
интерфейс имеетsort()
метод по умолчанию :См. Http://visvv.blogspot.in/2016/01/sorting-objects-in-java-8.html .
источник
Java 8 Lambda сокращает сортировку.
источник
Collections.sort(stdList, Comparator.comparing(SomeClass::getName));
Вы можете использовать Bean Comparator для сортировки по любому свойству в вашем пользовательском классе.
источник
Да, это возможно, например, в этом ответе я сортирую по свойству
v
классаIndexValue
Если вы заметили здесь, я создаю анонимный внутренний класс (который является Java для замыканий) и передаю его непосредственно
sort
методу классаArrays
Ваш объект также может реализовывать
Comparable
(это то, что делает String и большинство основных библиотек в Java), но это будет определять «естественный порядок сортировки» самого класса и не позволит вам подключать новые.источник
Comparator
:)Я обнаружил, что большинство, если не все из этих ответов полагаются на базовый класс (Object) для реализации сопоставимого или вспомогательного интерфейса.
Не с моим решением! Следующий код позволяет сравнивать поля объекта, зная их строковое имя. Вы можете легко изменить его, чтобы оно не использовало имя, но тогда вам нужно выставить его или создать один из объектов, с которыми вы хотите сравнить.
источник
Вы можете попробовать Guava Ordering :
источник
Вы можете сортировать, используя Java 8
источник
Этот фрагмент кода может быть полезным. Если вы хотите отсортировать объект в моем случае, я хочу отсортировать по VolumeName:
Это работает. Я использую это в моем JSP.
источник
С помощью этой библиотеки здесь вы можете сортировать список пользовательских объектов на несколько столбцов. Библиотека использует функции версии 8.0. Образец также доступен там. Вот образец, чтобы сделать
источник
Вы можете ознакомиться с этой презентацией на форуме Java в Штутгарте, Германия, в 2016 году.
Лишь несколько слайдов используют немецкий язык, 99% контента - это исходный код Java на английском языке; подобно
где
OurCustomComparator
используются методы по умолчанию (и другие интересные идеи). Как показано, приведение к очень лаконичному коду для выбора метода получения для сортировки; и супер простое сцепление (или изменение) критериев сортировки.Если вы в java8, вы найдете много материала, чтобы начать.
источник
Новое с версии 1.8 - это метод List.sort () вместо использования Collection.sort (), поэтому вы напрямую вызываете mylistcontainer.sort ()
Вот фрагмент кода, который демонстрирует функцию List.sort ():
Класс Fruit это:
источник
Ваш класс customComparator должен реализовывать java.util.Comparator для использования. он также должен переоценивать сравнить () И равно ()
Функция compare () должна ответить на вопрос: объект 1 меньше, равен или больше объекта 2?
полные документы: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Comparator.html
источник
Я предпочитаю этот процесс:
Если в вашем списке объектов есть свойство с именем
startDate
, вы вызываете его снова и снова. Вы даже можете приковать ихstartDate.time
.Это требует вашего объекта быть ,
Comparable
который означает , что вам нужнаcompareTo
,equals
иhashCode
реализация.Да, это может быть быстрее ... Но теперь вам не нужно создавать новый компаратор для каждого типа сортировки. Если вы можете сэкономить на времени разработки и отказаться от времени выполнения, вы можете пойти с этим.
источник
Использование Java 8 позволяет определить
Comparator
в одной строке, используяComparator.comparing()
Используйте любой из следующих способов:
Опция 1:
Вариант 2:
источник
Ваш пользовательский класс может реализовывать интерфейс «Comparable», который требует реализации метода CompareTo. В методе CompareTo вы можете определить, что означает, что объект меньше или больше другого объекта. Так что в вашем примере это может выглядеть примерно так:
..........
Отрицательное число указывает, что это меньше, чем сравниваемый объект. Положительное число указывает, что это больше, чем по сравнению с объектом, а ноль означает, что объекты равны.
Затем вы можете использовать collection.sort (myList), чтобы отсортировать список без подачи в компаратор. Этот метод также имеет преимущество в том, что вещи сортируются автоматически, если вы используете структуры данных отсортированной коллекции, такие как TreeSet или TreeMap.
Вы можете проверить эту статью, если хотите больше узнать об интерфейсе Comparable (раскрытие: я автор;)) https://nullbeans.com/the-java-comparable-interface-automatic-sort-of-collections/
источник
Вы также можете использовать Springs PropertyComparator, если у вас есть только путь свойства String к (вложенному) свойству, которое вы хотите отсортировать:
Недостатком является то, что этот компаратор молча игнорирует свойства, которые не существуют или недоступны, и обрабатывает это как нулевое значение для сравнения. Это означает, что вы должны тщательно протестировать такой компаратор или как-то проверить существование пути свойства.
источник
используя API потока java-8, вы можете отсортировать
ArrayList
по:источник
Я пробовал множество различных решений, доступных в Интернете, но решение, которое работает для меня, доступно по ссылке ниже.
https://www.java67.com/2017/07/how-to-sort-arraylist-of-objects-using.html
источник