Коллекции ·
‹ Предыдущий Следующий ›
⏱ 5 минут чтения Обновлено: 2026-10-27

Коллекции. Практические Задания

Добавьте в TreeSet два ящика одинакового веса — и в коллекции останется только один. Если compareTo() сравнивает лишь поле weight, второй ящик считается дубликатом и молча отбрасывается, без исключения:

Set<HeavyBox> boxes = new TreeSet<>(); // compareTo() сравнивает только weight
boxes.add(new HeavyBox(10, 20, 30, 5));
boxes.add(new HeavyBox(40, 50, 60, 5));
System.out.println(boxes.size()); // Вывод: 1

На этой странице — 10 практических задач по коллекциям Java с примерами входных данных: ArrayList, TreeSet, HashSet, ArrayDeque, HashMap, Iterator и Comparable. Задачи идут в порядке уроков модуля «Коллекции»: от списков к множествам, очередям и отображениям Map, а последняя продолжает сквозной проект «Интернет-магазин». К каждой задаче есть разбор решения.

Какая коллекция нужна в каждой задаче

Каждая задача отрабатывает одну коллекцию и 2–3 её ключевых метода. Если метод из таблицы незнаком, сначала повторите урок из правого столбца — так решение займёт 20–40 минут, а не вечер с документацией.

Задача Коллекция и методы Что повторить
Динамический массив ArrayList: add(), get(), remove(), toArray(), clear() Интерфейс List и ArrayList
TreeSet с сортировкой TreeSet, Comparable.compareTo() TreeSet, Comparable и Comparator
Набор чисел HashSet / LinkedHashSet, String.split() Set, HashSet и LinkedHashSet
union() и intersect() addAll(), retainAll(), обобщённые методы Интерфейс Collection
Очередь ArrayDeque: offer(), poll() Queue и Deque, ArrayDeque
Разделение коллекции Iterator: hasNext(), next(), remove() Iterator и ListIterator
HashMap книг HashMap: entrySet(), keySet(), values() Интерфейс Map
Студенты Set, equals() / hashCode(), удаление через Iterator Set и HashSet
Домашние животные Map<String, Pet>, полиморфизм Интерфейс Map
Интернет-магазин List, Comparator, List.sort() / Collections.sort() Методы класса Collections

ArrayList: динамический массив из объектов HeavyBox

  1. Создать динамический массив (ArrayList), содержащий объекты класса HeavyBox.
  2. Класс HeavyBox наследует класс Box и содержит переменную int weight.
  3. Класс Box содержит переменные double width, double height, double depth.
  4. Распечатать его содержимое, используя for each.
  5. Изменить вес первого ящика на 1.
  6. Удалить последний ящик.
  7. Получить массив, содержащий ящики из коллекции, тремя способами и вывести его на консоль.
  8. Удалить все ящики.

Подсказка

Массив из коллекции получают методами toArray() (вернёт Object[]), toArray(new HeavyBox[0]) и, начиная с Java 11, toArray(HeavyBox[]::new). Типизированный массив HeavyBox[] дают только два последних. Для вывода массива удобен Arrays.toString().

Решение на Patreon →

TreeSet с сортировкой ящиков по весу

  1. Создать TreeSet, содержащий объекты класса HeavyBox.
  2. Класс HeavyBox наследует класс Box и содержит переменную int weight.
  3. Класс Box содержит переменные double width, double height, double depth.
  4. HeavyBox должен реализовать интерфейс Comparable, сортировка должна осуществляться по переменной weight.
  5. Распечатать содержимое с помощью for each.

Решение на Patreon →

Удаление повторяющихся чисел из строки через Set

  1. Пользователь вводит набор чисел в виде одной строки "1, 2, 3, 4, 4, 5, 10, 11".
  2. Избавиться от повторяющихся элементов в строке.
  3. Вывести результат на экран.
  4. Используйте интерфейс Set.

Нюанс

HashSet не сохраняет порядок ввода. Чтобы вывести числа в исходной последовательности — 1, 2, 3, 4, 5, 10, 11 — возьмите LinkedHashSet. Строку удобно разбить через split("\\s*,\\s*"): так пробелы вокруг запятых не попадут в элементы, и "4" с " 4" не окажутся разными строками.

Решение на Patreon →

Объединение и пересечение множеств: union() и intersect()

  1. Напишите методы static <T> Set<T> union(Set<T> set1, Set<T> set2) и static <T> Set<T> intersect(Set<T> set1, Set<T> set2), реализующие операции объединения и пересечения множеств.
  2. Методы должны возвращать новое множество и не изменять set1 и set2.
  3. Протестируйте работу этих методов на предварительно заполненных множествах.

Решение на Patreon →

Очередь ArrayDeque: методы offer() и poll()

  1. Создать очередь, содержащую объекты класса HeavyBox.
  2. Класс HeavyBox наследует класс Box и содержит переменную int weight.
  3. Класс Box содержит переменные double width, double height, double depth.
  4. Используйте класс ArrayDeque.
  5. Поместить объекты в очередь с помощью метода offer().
  6. Удалить объекты методом poll().

Решение на Patreon →

Разделение коллекции с помощью Iterator

  1. Создать коллекцию, содержащую объекты класса Box.
    public class Box {
        private double width;
        private double height;
        private double depth;
    
        public Box(double width, double height, double depth) {
            this.width = width;
            this.height = height;
            this.depth = depth;
        }
    
        public double getWidth() {
            return width;
        }
    
        // getHeight(), getDepth() и toString() — аналогично
    }
  2. Написать метод, который перебирает элементы коллекции и проверяет ширину коробок.
  3. Если ширина коробки больше 30 см, коробка перемещается в другую коллекцию.
  4. Для перебора элементов используйте итератор.

Решение на Patreon →

HashMap книг: entrySet(), keySet() и values()

  1. Создайте HashMap, содержащий пары значений — имя книги и объект книги (класс Book).
  2. Класс Book содержит переменные name, cost, author.
  3. Перебрать и распечатать пары значений — entrySet().
  4. Перебрать и распечатать набор из имён книг — keySet().
  5. Перебрать и распечатать значения книг — values().
  6. Для каждого перебора создать свой метод.

Ещё один способ

После трёх обязательных вариантов попробуйте четвёртый — books.forEach((name, book) -> System.out.println(name + ": " + book)) (Java 8). Он короче, но внутри делает то же, что перебор entrySet().

Решение на Patreon →

Студенты: фильтрация по среднему баллу и перевод на курс

  1. Создать класс Student, содержащий следующие характеристики – имя, группа, курс, оценки по предметам.
  2. Создать коллекцию Set<Student>, содержащую объекты класса Student. Переопределите в Student методы equals() и hashCode().
  3. Написать метод, который удаляет студентов со средним баллом < 3.
  4. Написать метод, который переводит студента на следующий курс, если средний балл >= 3.
  5. Напишите метод printStudents(Set<Student> students, int course), который получает множество студентов и номер курса. Метод печатает на консоль имена тех студентов, которые обучаются на данном курсе.

Решение на Patreon →

Map домашних животных: имя и объект Pet

  1. Создайте класс Pet с переменной name и абстрактным методом makeNoise().
  2. Создайте наследников класса Pet — Cat, Dog, Parrot. Каждый класс реализует свой вариант метода makeNoise().
  3. Создайте отображение из домашних животных, где в качестве ключа выступает имя животного, а в качестве значения — объект класса Pet.
  4. Добавьте в отображение разных животных.
  5. Создайте метод, выводящий на консоль все ключи отображения.
  6. Создайте метод, вызывающий метод makeNoise() для каждого животного.

Решение на Patreon →

Коллекции вместо массивов, сортировка каталога

Интернет-магазин · часть 6 из 13 · ← часть 5 · часть 7 →

  1. Вместо массивов используйте коллекции.
  2. Товары каталога должны быть отсортированы, например по цене. Для сортировки используйте Comparator и List.sort() или Collections.sort().

Решение на Patreon →

На чём чаще всего ошибаются

Большинство ошибок в задачах по коллекциям не ломают компиляцию: код запускается, но теряет элементы, хранит дубликаты или падает с исключением только на определённых данных. Ниже — промахи, которые чаще всего встречаются в решениях этой страницы.

Ошибка Что произойдёт Как исправить
Удаление через list.remove(box) внутри for each Как правило — ConcurrentModificationException на следующей итерации. Но если удалён предпоследний элемент, исключения не будет: цикл просто завершится и последний элемент останется непроверенным Удалять через iterator.remove() или removeIf() (Java 8)
compareTo() сравнивает только weight TreeSet считает ящики одного веса одинаковыми и хранит только первый Сравнивать дополнительные поля, если они равны по весу: Comparator.comparingInt(HeavyBox::getWeight).thenComparingDouble(Box::getWidth)
Свой класс в HashSet или как ключ HashMap без equals() и hashCode() Два одинаковых студента хранятся дважды, contains() для копии возвращает false Переопределить оба метода (или использовать record, Java 16+)
Ожидание порядка добавления от HashMap Книги и животные выводятся в непредсказуемом порядке, который может меняться при росте таблицы LinkedHashMap — порядок добавления, TreeMap — сортировка по ключу
union() через set1.addAll(set2) Метод «портит» исходное множество set1, и следующий вызов intersect() даёт неверный результат Работать с копией: Set<T> result = new HashSet<>(set1);
Изменение списка из List.of() или Arrays.asList() UnsupportedOperationException при add()/remove() Обернуть в изменяемый список: new ArrayList<>(List.of(...)). Подробнее — в уроке Backed Collections

Проверь свой код

Объявляйте переменные через интерфейс (List<HeavyBox> boxes = new ArrayList<>()), а не через класс реализации, и не используйте сырые типы без <>. Остальные правила оформления — в чек-листе по оформлению кода.

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

Какую коллекцию Java выбрать: List, Set, Queue или Map?

List — когда важен порядок и допустимы дубликаты (по умолчанию ArrayList). Set — когда нужны только уникальные элементы: HashSet самый быстрый, LinkedHashSet хранит порядок добавления, TreeSet сортирует. Queue/Deque — для обработки элементов по очереди или как стек (ArrayDeque). Map — когда значение ищется по ключу. Какая коллекция нужна в каждой задаче страницы — в таблице выше.

Какие задачи по коллекциям Java дают на собеседовании?

Чаще всего: убрать дубликаты из списка, найти пересечение двух множеств, удалить элементы во время перебора без ConcurrentModificationException, отсортировать объекты через Comparable или Comparator, посчитать частоту слов через HashMap и реализовать LRU-кэш. Первые четыре темы отрабатываются в задачах этой страницы, LRU-кэш разобран в уроке LinkedHashMap.

Можно ли решать эти задачи через Stream API?

Можно, но сначала решите их на «чистом» API коллекций: цель задач — отработать Iterator, entrySet(), retainAll() и сравнение объектов. Вариант со stream().filter() полезен как второе решение для сравнения, но он не объясняет, почему удаление в for each заканчивается исключением.

В каком порядке решать задачи и сколько времени они займут?

Порядок повторяет уроки модуля: ArrayList → TreeSet и HashSet → ArrayDeque → Iterator → HashMap → итоговая часть интернет-магазина. Одна задача занимает 20–60 минут, вся страница — около 5–6 часов.

Комментарии

unknown Jan 18, 2023
Решение к Задаче №1 https://www.online-java.com/4HbGFs95gw
unknown Jan 20, 2023
Решение к Задаче №6 https://www.online-java.com/itkn4RTs7F
unknown Jan 20, 2023
Решение к Задаче №6 https://www.online-java.com/itkn4RTs7F
unknown Jan 20, 2023
Решение к Задаче №7 https://www.online-java.com/o27FbVmRsy
unknown Jan 22, 2023
Решение к Задаче№2, в задаче не предоставлен класс HeavyBox, так как он есть в Задаче1 https://www.online-java.com/s6fRZEdjtY
unknown Jan 22, 2023
Решение к Задаче №3 https://www.online-java.com/BqU8Qt2N63
unknown Jan 22, 2023
Решение к Задаче №4, ощущение, что правильное решение не такое, буду признателен тому, кто поправит! https://www.online-java.com/r12LAh5X7v
unknown Jan 22, 2023
Решение к Задаче №8 https://www.online-java.com/gXcBnDhu8G

Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.