Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Сортировка списков Java: Списки

Отдельным пунктом в работе с коллекциями стоит сортировка. В отличие от собеседований, где просят реализовать разные виды сортировки для проверки алгоритмических навыков, в реальной жизни сортировку самостоятельно не реализуют. В 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())
);

Для более глубокого понимания темы мы рекомендуем просмотреть видео лекцию, которая является дополнительным материалом к данному курсу:


Дополнительные материалы

  1. Метод Collections.sort()
  2. Структуры данных в картинках. ArrayList
  3. Обзорная статья по структурам данных

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 21 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу