Java Academy · Урок

Сортировка массивов и коллекций на практике

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

Урок 4 из 414 шагов

«Сортировка массивов и коллекций на практике» — бесплатный урок Java Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Сортировка на практике

В этом уроке методы сортировки применяются к реалистичным сценариям: каталогам товаров, таблицам лидеров, планированию событий и ранжированию результатов поиска.

Arrays.sort для массивов примитивов

Arrays.sort() для массивов примитивов использует быструю сортировку с двумя опорными элементами — она чрезвычайно быстрая, в среднем O(n log n).

int[] scores = {45, 90, 78, 62, 88, 33};
Arrays.sort(scores);
System.out.println(Arrays.toString(scores)); // [33, 45, 62, 78, 88, 90]

// Sort a range only
int[] data = {9, 3, 7, 1, 5};
Arrays.sort(data, 1, 4); // sort indices 1-3 only
System.out.println(Arrays.toString(data)); // [9, 1, 3, 7, 5]

Arrays.sort для массивов объектов

Для массивов объектов Arrays.sort() использует TimSort (стабильную сортировку). Можно передать Comparator для пользовательского порядка.

String[] names = {"Charlie", "Alice", "Bob", "Diana"};
Arrays.sort(names);
System.out.println(Arrays.toString(names)); // [Alice, Bob, Charlie, Diana]

// Custom order: by length, then alphabetically
Arrays.sort(names, Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()));
System.out.println(Arrays.toString(names)); // [Bob, Alice, Diana, Charlie]

Collections.sort и List.sort

Оба метода сортируют List на месте. List.sort() — современный предпочтительный вариант.

List<Integer> nums = new ArrayList<>(List.of(5, 2, 8, 1, 9, 3));

// Old way
Collections.sort(nums);
System.out.println(nums); // [1, 2, 3, 5, 8, 9]

// Modern way (same result)
nums.sort(Comparator.naturalOrder());
nums.sort(null); // null means natural order

// Descending
nums.sort(Comparator.reverseOrder());
System.out.println(nums); // [9, 8, 5, 3, 2, 1]

Stream.sorted() в функциональном стиле

Используйте stream().sorted() при построении конвейера — он создает новый отсортированный поток, не изменяя исходный.

List<String> cities = List.of("Tokyo", "London", "New York", "Paris", "Sydney");

// Sorted stream — source list unchanged
List<String> sorted = cities.stream()
    .sorted(Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()))
    .collect(Collectors.toList());

System.out.println(sorted);
// [Paris, Tokyo, London, Sydney, New York]

Сортировка Map по значению

Классический вопрос на собеседовании: отсортировать Map по значениям с помощью stream и Comparator.

import java.util.*;
import java.util.stream.*;

Map<String, Integer> scores = Map.of(
    "Alice", 95, "Bob", 87, "Charlie", 92, "Diana", 87
);

Map<String, Integer> sorted = scores.entrySet().stream()
    .sorted(Map.Entry.<String, Integer>comparingByValue(Comparator.reverseOrder())
        .thenComparing(Map.Entry.comparingByKey()))
    .collect(Collectors.toLinkedHashMap(
        Map.Entry::getKey, Map.Entry::getValue,
        (v1, v2) -> v1, LinkedHashMap::new));

sorted.forEach((k, v) -> System.out.println(k + ": " + v));
// Alice: 95 / Charlie: 92 / Bob: 87 / Diana: 87

Сортировка с Collator с учетом локали

Для сортировки строк с учетом языка используйте java.text.Collator вместо String.compareTo — он обрабатывает диакритические знаки, регистр и порядок, зависящий от локали.

import java.text.*;
import java.util.*;

List<String> names = new ArrayList<>(List.of("éclair", "apple", "Über", "banana"));

Collator collator = Collator.getInstance(Locale.GERMAN);
names.sort(collator);
System.out.println(names); // locale-aware sort

Сортировка объектов по нескольким критериям

Сортировка товаров в интернет-магазине: сначала товары в наличии, затем по цене со скидкой, затем по рейтингу и затем по названию.

record Product(String name, double price, double salePrice, double rating, boolean inStock) {}

Comparator<Product> bestFirst = Comparator
    .comparing(Product::inStock).reversed()           // in-stock first
    .thenComparingDouble(Product::salePrice)          // cheapest sale price
    .thenComparingDouble(Product::rating).reversed()  // highest rated
    .thenComparing(Product::name);                    // alphabetical tiebreak

Сортировка событий по дате и времени

Хронологическая сортировка расписания событий с использованием типов java.time, реализующих Comparable.

import java.time.*;
import java.util.*;

record Event(String title, LocalDate date, LocalTime time) {}

List<Event> schedule = new ArrayList<>(List.of(
    new Event("Workshop",  LocalDate.of(2024,7,15), LocalTime.of(9, 0)),
    new Event("Keynote",   LocalDate.of(2024,7,14), LocalTime.of(10, 30)),
    new Event("Lunch Talk",LocalDate.of(2024,7,15), LocalTime.of(12, 0)),
    new Event("Hackathon", LocalDate.of(2024,7,14), LocalTime.of(9, 0))
));

schedule.sort(Comparator.comparing(Event::date).thenComparing(Event::time));
schedule.forEach(e -> System.out.println(e.date() + " " + e.time() + " " + e.title()));

Поиск первых N элементов с помощью сортировки

Эффективный поиск первых N элементов: отсортируйте по убыванию и возьмите первые N элементов либо используйте PriorityQueue для больших наборов данных.

List<Integer> values = List.of(42, 17, 88, 5, 73, 56, 91, 33);

// Simple approach: sort descending, take first 3
List<Integer> top3 = values.stream()
    .sorted(Comparator.reverseOrder())
    .limit(3)
    .collect(Collectors.toList());
System.out.println(top3); // [91, 88, 73]

// For very large datasets: PriorityQueue min-heap approach is O(n log k)
import java.util.PriorityQueue;
PriorityQueue<Integer> heap = new PriorityQueue<>(3);
for (int v : values) {
    heap.offer(v);
    if (heap.size() > 3) heap.poll();
}
System.out.println(new TreeSet<>(heap).descendingSet()); // [73, 88, 91]

Удаление дубликатов с помощью сортировки

После сортировки дубликаты находятся рядом, поэтому их можно обнаружить за O(n).

int[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5};
Arrays.sort(arr); // sort first

// Remove duplicates in O(n) after sorting
int[] unique = Arrays.stream(arr).distinct().toArray();
System.out.println(Arrays.toString(unique)); // [1, 2, 3, 4, 5, 6, 9]

Производительность: выбор метода сортировки

Выбор подходящего способа сортировки:

  • Массивы примитивов: Arrays.sort() — самый быстрый вариант, быстрая сортировка на месте
  • Массивы или списки объектов с Comparable: Collections.sort() или List.sort(null)
  • Несколько порядков сортировки: цепочки Comparator с thenComparing
  • Первые N элементов из большого потока: PriorityQueue или Stream.sorted().limit(N)

Быстрая проверка

Какой алгоритм сортировки Java использует для массивов объектов в Arrays.sort()?

Итоги: сортировка массивов и коллекций на практике

Основные выводы:

  • Arrays.sort() для примитивов использует быструю сортировку с двумя опорными элементами, а для объектов — TimSort (стабильную сортировку)
  • List.sort(comparator) и Collections.sort() используют стабильную сортировку TimSort
  • stream().sorted() создает новый отсортированный поток, не изменяя исходный
  • Сортировка Map по значению: entrySet().stream().sorted(Map.Entry.comparingByValue())
  • Используйте Collator для сортировки строк с учетом локали
  • Для поиска первых N элементов в больших наборах данных PriorityQueue с вместимостью k эффективнее полной сортировки
Можно начать бесплатно

Изучай Java с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
104
Уроки
374

Часто задаваемые вопросы

Урок «Сортировка массивов и коллекций на практике» бесплатный?

Да — полный текст урока «Сортировка массивов и коллекций на практике» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Сортировка массивов и коллекций на практике»?

Применяйте сортировку к спискам товаров, таблицам лидеров и расписаниям событий на реальных примерах. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Сортировка массивов и коллекций на практике»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Интерфейс Comparable
  2. Сортировка с Comparator и лямбда-выражениями
  3. Сортировка по нескольким ключам с thenComparing
  4. Сортировка массивов и коллекций на практике
← Назад к Java Academy