Отдельным пунктом в работе с коллекциями стоит сортировка. В отличие от собеседований, где просят реализовать разные виды сортировки для проверки алгоритмических навыков, в реальной жизни сортировку самостоятельно не реализуют. В Java встроены все необходимые элементы для реализации сортировок любой сложности.
Простая сортировка
Самый простой способ отсортировать коллекцию по возрастанию — это воспользоваться методом Collections.sort()
. Этот метод принимает на вход коллекцию и меняет ее напрямую.
import java.util.Collections;
// Делаем список изменяемым
var temperatures = new ArrayList<>(List.of(20, 25, 18, 19, 22, 17, 20));
// Сортировка меняет (мутирует) сам список
Collections.sort(temperatures);
System.out.println(temperatures); // => [17, 18, 19, 20, 20, 22, 25]
Эта сортировка работает с примитивными типами и сортирует значения с учетом естественного порядка по возрастанию. Под естественным порядком понимается движение от меньшего числа к большему. В случае строк это сортировка в лексиграфическом порядке, который в большинстве случаев совпадает с алфавитным порядком.
var languages = new ArrayList<>(List.of(
"ruby",
"php",
"python",
"javascript"
));
Collections.sort(languages);
System.out.println(languages); // => [javascript, php, python, ruby]
Сортировка по условию
Сортировка может быть не только в прямом порядке, но и обратном. Кроме того, нам могут понадобиться разные условия сортировки, например без учета регистра, по какому-то конкретному свойству объекта и так далее. Для реализации подобных сортировок в Collections
добавлен метод sort()
с двумя параметрами. Второй параметр нужен для передачи Comparator
, объект, который определяет то, как выполняется сравнение элементов. Вот как с его помощью выполняется обратная сортировка:
import java.util.Collections;
// Делаем список изменяемым
var temperatures = new ArrayList<>(List.of(20, 25, 18, 19, 22, 17, 20));
// Сортировка меняет (мутирует) сам список
Collections.sort(temperatures, Collections.reverseOrder());
System.out.println(temperatures); // => [25, 22, 20, 20, 19, 18, 17]
А вот сортировка без учета регистра:
var languages = new ArrayList<>(List.of(
"Ruby",
"php",
"Python",
"Javascript"
));
Collections.sort(languages, String.CASE_INSENSITIVE_ORDER);
System.out.println(languages); // [Javascript, php, Python, Ruby]
Сортировка объектов
Для сортировки объектов нужно явно указывать то как выполнять сортировку, так как, в отличии, от тех же чисел, не существует универсального способа сортировки объектов. Например, пользователей на сайте можно выводить по возрасту, по дате регистрации или количеству пройденных курсов.
Java предоставляет удобный способ выполнять такую сортировку с помощью лямбда-функций. На текущий момент мы их еще не изучали, поэтому код здесь дается просто для примера, подробно про него мы поговорим в следующих курсах.
var users = new ArrayList<>();
users.add(new User("Alice", 20));
users.add(new User("Bob", 18));
users.add(new User("Charlie", 22));
// Сортирует список пользователей, основываясь на их возрасте
Collections.sort(
users,
// Лямбда-функция
// user1 и user2 это соседние значения в списке,
// которые сравниваются последовательно
(user1, user2) -> Integer.compare(user1.getAge(), user2.getAge())
);
Для более глубокого понимания темы мы рекомендуем просмотреть видео лекцию, которая является дополнительным материалом к данному курсу:
Дополнительные материалы
- Метод Collections.sort()
- Структуры данных в картинках. ArrayList
- Обзорная статья по структурам данных
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.