Java. Сортировки коллекций

SORT

 

 Рассмотрим сортировки объектов в Java:

Методы:


1.sort 

2.reversed 

3.thenComparing 

4.Collections.sort

public class User {
private String userName;
private int userAge;

public User(String userName, int userAge) {
this.userName = userName;
this.userAge = userAge;
}

public static List<User> getUsers() {
List<User> users = new ArrayList<>();
users.add(new User("Ivan", 34));
users.add(new User("Alex", 35));
users.add(new User("Max", 21));
users.add(new User("Tom", 45));
users.add(new User("Richard", 52));
users.add(new User("Donald", 19));
return users;
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public int getUserAge() {
return userAge;
}

public void setUserAge(int userAge) {
this.userAge = userAge;
}

@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", userAge=" + userAge +
'}';
}


@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return userAge == user.userAge &&
Objects.equals(userName, user.userName);
}

@Override
public int hashCode() {

return Objects.hash(userName, userAge);
}
}

Наша коллекция:
[User{userName='Donald', userAge=19},
 User{userName='Max', userAge=21},
 User{userName='Ivan', userAge=34},
 User{userName='Alex', userAge=35},
 User{userName='Tom', userAge=45},
 User{userName='Richard', userAge=52}]


1. sort - сортировка по интерфейсу Comparator

Пример:
Сортировка по возрасту по возрастанию:
List<User> users = User.getUsers();
users.sort(Comparator.comparing(User::getUserAge));
System.out.println(users);
Вывод:
[User{userName='Donald', userAge=19},
 User{userName='Max', userAge=21},
 User{userName='Ivan', userAge=34},
 User{userName='Alex', userAge=35},
 User{userName='Tom', userAge=45},
 User{userName='Richard', userAge=52}]

2. reversed - сортировка по убыванию:

Пример:
List<User> users = User.getUsers();
users.sort(Comparator.comparing(User::getUserAge).reversed());
System.out.println(users);
Вывод:
[User{userName='Richard', userAge=52},
 User{userName='Tom', userAge=45},
 User{userName='Alex', userAge=35},
 User{userName='Ivan', userAge=34},
 User{userName='Max', userAge=21}, 
User{userName='Donald', userAge=19}]

3. thenComparing - сначала сортируем по возрасту,
потом по имени в обратном порядке:

List<User> users = User.getUsers();
users.sort(Comparator.comparing(User::getUserAge)
.thenComparing(User::getUserName).reversed());
System.out.println(users);

4. Также у класса Collections есть метод sort:

Можно создать класс UsersSortComparator:
public class UsersSortComparator {
public static Comparator<User> BY_AGE =
Comparator.comparing(User::getUserAge);
public static Comparator<User> BY_AGE_DESC =
 BY_AGE.reversed();
}

Ну и делать сортировки по убыванию и возрастанию:
List<User> users = User.getUsers();
Collections.sort(users, UsersSortComparator.BY_AGE);
System.out.println(users);
Collections.sort(users, UsersSortComparator.BY_AGE_DESC);
System.out.println(users);
Но все-таки запись:
users.sort(UsersSortComparator.BY_AGE_DESC);
Намного легче для восприятия, чем:
Collections.sort(users, UsersSortComparator.BY_AGE_DESC);
А используя статический импорт, код становится еще проще:
users.sort(BY_AGE);







Комментарии

Популярные сообщения из этого блога

Java. Лучшая практика работы с Enum

Java. Разбор класса Collections

Java. Удаление данных из коллекции