Сортировка массивов и коллекций на практике
Применяйте сортировку к спискам товаров, таблицам лидеров и расписаниям событий на реальных примерах.
«Сортировка массивов и коллекций на практике» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Интерфейс Comparable
- Сортировка с Comparator и лямбда-выражениями
- Сортировка по нескольким ключам с thenComparing
- Сортировка массивов и коллекций на практике