Сортировка списка объектов по полям в Java
Первоначально опубликовано в моем блоге по адресу www.codebyamir.com Обзор Java предоставляет ряд… Помеченный java.
Первоначально опубликовано в моем блоге по адресу Первоначально опубликовано в моем блоге по адресу
Java предоставляет несколько способов сортировки списка. В этой статье мы продемонстрируем, как сортировать список объектов по полям.
В наших примерах мы будем использовать следующий класс пользователя:
package com.example.demo; import java.util.Date; public class User < private long id; private String email; private Date createdOn; // other getters and setters omitted public Date getCreatedOn() < return createdOn; >public void setCreatedOn(Date createdOn) < this.createdOn = createdOn; >>
Предположим, у нас есть метод службы, который возвращает список всех пользователей:
Listusers = userService.getAllUsers();
Итак, у нас есть список пользователей, и мы хотим отсортировать их по дате создания.
Давайте рассмотрим несколько различных подходов и рассмотрим преимущества и ограничения каждого из них.
Вариант 1: Коллекции.сортировка() с сопоставимыми
Мы можем использовать интерфейс Comparable для определения критериев сортировки по умолчанию для класса.
Для этого требуется реализовать метод compareTo() , как показано ниже:
package com.example.demo; import java.util.Date; public class User implements Comparable< private long id; private String email; private Date createdOn; // other getters and setters omitted public Date getCreatedOn() < return createdOn; >public void setCreatedOn(Date createdOn) < this.createdOn = createdOn; >@Override public int compareTo(User u) < if (getCreatedOn() == null || u.getCreatedOn() == null) < return 0; >return getCreatedOn().compareTo(u.getCreatedOn()); > >
Теперь мы можем вызвать Collections.sort() для выполнения сортировки.
Сортировка по дате создания по возрастанию
Сортировка по дате создания нисходящий
Collections.sort(users); Collections.reverse(users);
Этот параметр требует изменения нашего класса и определения порядка сортировки по умолчанию (или естественного). Сортировка в порядке убывания требует двух отдельных вызовов методов.
Этот параметр не позволяет выполнять сортировку по другому полю, отличному от того, которое мы выбрали.
Вариант 2: Коллекции.сортировка() с помощью компаратора
Вместо изменения нашего класса мы можем передать компаратор в Collections.sort() . В приведенных ниже примерах создается компаратор с использованием анонимного класса.
Сортировка по дате создания по возрастанию
Collections.sort(users, new Comparator() < @Override public int compare(User u1, User u2) < return u1.getCreatedOn().compareTo(u2.getCreatedOn()); >>);
Сортировка по дате создания нисходящий
Мы меняем порядок u1 и u2 местами, чтобы изменить порядок сортировки.
Collections.sort(users, new Comparator() < @Override public int compare(User u1, User u2) < return u2.getCreatedOn().compareTo(u1.getCreatedOn()); >>);
Этот параметр позволяет коду вне класса определять критерии сортировки и порядок.
Однако для этого требуется уродливый анонимный класс, который не очень удобочитаем.
Вариант 3: Сортировка интерфейса списка() [ Java 8]
Java 8 представила метод сортировки в интерфейсе списка, который может использовать компаратор.
Метод Comparator.comparing() принимает ссылку на метод, которая служит основой для сравнения. Итак, мы проходим Пользователь::getCreatedOn для сортировки по полю CreatedOn.
Сортировка по дате создания по возрастанию
users.sort(Comparator.comparing(User::getCreatedOn));
Сортировка по дате создания нисходящий
users.sort(Comparator.comparing(User::getCreatedOn).reversed());
Как мы видим, код становится намного проще и легче читается.
Вариант 4: Сортировка интерфейса потока() [ Java 8]
Предположим, мы не хотели изменять исходный список, но возвращали новый отсортированный список.
В этой ситуации мы можем использовать метод sorted() из интерфейса Stream , представленного в Java 8.
Возвращает новый список, отсортированный по дате создания по возрастанию
ListsortedUsers = users.stream() .sorted(Comparator.comparing(User::getCreatedOn)) .collect(Collectors.toList());
Возвращает новый список, отсортированный по дате создания по убыванию
ListsortedUsers = users.stream() .sorted(Comparator.comparing(User::getCreatedOn).reversed()) .collect(Collectors.toList());
В то время как каждый из обсуждаемых вариантов выполняет сортировку, последние два варианта рекомендуются, поскольку их легче кодировать, отлаживать и читать.
Читайте ещё по теме:
Java Collections sort()
Learn to use Collections.sort() method to sort a list of objects using some examples.
By default, the sort() method sorts a given list into ascending order (or natural order). We can use Collections.reverseOrder() method, which returns a Comparator, for reverse sorting.
1. Sorting in Natural Order and Reverse Order
Collections.sort(list); //Sorts in natural order Collections.sort(list, Collections.reverseOrder()); //Sorts in reverse order
- Above method sorts the specified list of items into their natural order.
- All items must implement the Comparable interface.
- All items must be mutually comparable and should not throw ClassCastException .
- This sort is guaranteed to be stable. It means that equal elements will not be reordered as a result of the sort.
- The specified list must be modifiable, but need not to be resizable.
- The sort() does not return any value.
1.1. Sorting an ArrayList of Strings
Java program to sort a list of strings lexicographically (in the dictionary order).
List names = Arrays.asList("Alex", "Charles", "Brian", "David"); //Prints - [Alex, Brian, Charles, David] Collections.sort(names); //Prints - [David, Charles, Brian, Alex] Collections.sort(names, Collections.reverseOrder());
1.2. Sorting ArrayList of Objects by Field
We may require to sort a list of custom objects which can have their own sorting logic. In this case, implement the Comparator interface in the custom class.
For example, the domain object Employee has default sorting on the name field. Checkout for comparison logic in compareTo() method.
public class Employee implements Comparable < private Integer id; private String name; private String email; private LocalDate dateOfBirth; //Getters and Setters @Override public int compareTo(Employee e) < return this.getName().compareTo(e.getName()); >>
Nest Java program sorts the list of Employee objects by their name;
ArrayList employees = methodReturnsUnsortedList(); //Narutal order sorting Collections.sort(employees); //Reverse sorting Collections.sort(employees, Collections.reverseOrder());
2. Custom Sorting using Comparators
The second parameter in sort() method takes an instance of Comparator .
We can implement any kind of comparison logic with the help of comparators and then we can use sort() method to sort the list based on the given custom logic.
Collections.sort(List, Comparator);
We can create a separate Comparator instances for each kind of sorting need, and then we can combine those instances to create group sorting effect.
For example, if we want to sort the Employee list on three fields – id, name, and age. In this case, we need to create 3 Comparator instances.
2.1. Creating Custom Comparator
This is general syntax to create a Comparator in Java. In this case, we are creating a Comparator which will sort the Employee list by id field.
Comparator compareById = new Comparator() < @Override public int compare(Employee o1, Employee o2) < return o1.getId().compareTo(o2.getId()); >>; Comparator compareByName = new Comparator() < @Override public int compare(Employee o1, Employee o2) < return o1.getName().compareTo(o2.getName()); >>;
We can use lambda expression for further shortening the syntax.
//Id Comparator Comparator compareById = (Employee o1, Employee o2) -> o1.getId().compareTo( o2.getId() ); //Name Comparator Comparator compareByName = (Employee o1, Employee o2) -> o1.getName().compareTo( o2.getName() );
2.2. Using Comparator for Sorting
ArrayList employees = getUnsortedEmployeeList(); Comparator compareById = (Employee o1, Employee o2) -> o1.getId().compareTo( o2.getId() ); Collections.sort(employees, compareById); Collections.sort(employees, compareById.reversed());
In the above code examples, we learned to sort an ArrayList in default order or reverse order.
We also learned to use the Comparators for implementing the custom sorting logic.