JavaRush /Курсы /Java Syntax Pro /Вспомогательный класс Collections

Вспомогательный класс Collections

Java Syntax Pro
14 уровень , 3 лекция
Открыта

1. Список методов

Помните, что разработчики Java для удобства работы с массивами написали целый класс-помощник — Arrays?

Для коллекций они сделали то же самое. В Java есть класс java.util.Collections, у которого очень много методов, полезных при работе с коллекциями. Ниже приведем только самые интересные из них:

Методы Описание
addAll(colls, e1, e2, e3, ..)
Добавляет в коллекцию colls элементы e1, e2, e3,...
fill(list, obj)
Заменяет в переданном списке все элементы на obj
nCopies(n, obj)
Возвращает список, состоящий из n копий объекта obj
replaceAll(list, oldVal, newVal)
Заменяет в списке list все значения oldVal на newVal
copy(dest, src)
Копирует все элементы из списка src в список dest
reverse(list)
Разворачивает список задом наперед
sort(list)
Сортирует список в порядке возрастания
rotate(list, n)
Циклично сдвигает элементы списка list на n элементов
shuffle(list)
Случайно перемешивает элементы списка
min(colls)
Находит минимальный элемент коллекции colls
max(colls)
Находит максимальный элемент коллекции colls
frequency(colls, obj)
Определяет, сколько раз элемент obj встречается в коллекции colls
binarySearch(list, key)
Ищет элемент key в отсортированном списке, возвращает индекс.
disjoint(colls1, colls2)
Возвращает true, если у коллекций нет общих элементов
Важно:

Многие из этих методов работают не с классами ArrayList, HashSet и HashMap, а с их интерфейсами: Collection<T>, List<T>, Map<K, V>.

Это не проблема: если метод принимает List<T>, в него всегда можно передать ArrayList<Integer>, но вот в обратную сторону присваивание не работает.


2. Создание и изменение коллекций

Метод Collections.addAll(Collection<T> colls, T e1, T e2, T e3, ...)

Метод addAll() добавляет в коллекцию colls элементы e1, e2, e3, ... Количество переданных элементов может быть любым.

Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 1, 2, 3, 4, 5);

for (int i: list)
   System.out.println(i);
1
2
3
4
5

Метод Collections.fill(List<T> list, T obj)

Метод fill() заменяет все элементы коллекции list на элемент obj.

Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

Collections.fill(list, 10);

for (int i: list)
   System.out.println(i);
10
10
10

Метод Collections.nCopies (int n, T obj)

Метод nCopies() возвращает список из n копий элементов obj. Список можно назвать фиктивным (реального массива внутри нет), поэтому изменять его нельзя! Можно использовать только для чтения.

Код Описание
List<String> fake = Collections.nCopies(5, "Привет");

ArrayList<String> list = new ArrayList<String>(fake);

for(String s: list)
   System.out.println(s);
Создаем неизменяемый список из 5 элементов Привет
Создаем реальный список list, заполняем его значениями из списка fake.

Выводим на экран:
Привет
Привет
Привет
Привет
Привет

Метод Collections.replaceAll (List<T> list, T oldValue, T newValue)

Метод replaceAll() заменяет все элементы коллекции list, равные oldValue, на элемент newValue.

Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

Collections.replaceAll(list, 2, 20);

for (int i: list)
   System.out.println(i);
1
20
3

Метод Collections.copy (List<T> dest, List<T> src)

Метод copy() копирует все элементы коллекции src в коллекцию dest.

Если изначально коллекция dest длиннее чем коллекция src, то оставшиеся элементы в коллекции dest останутся нетронутыми.

Важно:
Коллекция dest должна иметь длину не меньше, чем длина коллекции src (иначе кинется исключение IndexOutOfBoundsException).
Код Вывод на экран
ArrayList<Integer> srcList = new ArrayList<Integer>();
Collections.addAll(srcList, 99, 98, 97);

ArrayList<Integer> destList = new ArrayList<Integer>();
Collections.addAll(destList, 1, 2, 3, 4, 5, 6, 7);

Collections.copy(destList, srcList);

for (int i: destList)
   System.out.println(i);
99
98
97
4
5
6
7

14
Задача
Java Syntax Pro, 14 уровень, 3 лекция
Недоступна
Изучаем методы класса Collections, часть 1
В классе Solution объявлены методы: copy(ArrayList, ArrayList), addAll(ArrayList, String...), replaceAll(ArrayList, String, String). Тебе нужно переписать их реализацию, используя при этом только соответствующие методы класса Collections. Параметр String... означает

3. Порядок элементов

Метод Collections.reverse(List<T> list)

Метод reverse() меняет порядок переданных в него элементов списка на обратный.

Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 1, 2, 3, 4, 5);

Collections.reverse(list);

for (int i: list)
   System.out.println(i);
5
4
3
2
1

Метод Collections.sort(List<T> list)

Метод sort() сортирует переданный в него список по возрастанию.

Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 11, 2, 23, 4, 15);

Collections.sort(list);

for (int i: list)
   System.out.println(i);
2
4
11
15
23

Метод Collections.rotate(List<T> list, int distance)

Метод rotate() циклическим образом сдвигает переданные в него элементы на distance позиций вперед.

Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8, 9);

Collections.rotate(list, 3); // сдвинуть на 3 позиции

for (int i: list)
   System.out.println(i);
7
8
9
1
2
3
4
5
6

Метод Collections.shuffle(List<T> list)

Метод shuffle() случайным образом перемешивает все элементы переданного списка. Результат каждый раз разный.

Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 1, 2, 3, 4, 5);

Collections.shuffle(list); // перемешиваем

for (int i: list)
   System.out.println(i);
5
2
4
3
1

14
Задача
Java Syntax Pro, 14 уровень, 3 лекция
Недоступна
Изучаем методы класса Collections, часть 2
В классе Solution объявлены методы: reverse(ArrayList), sort(ArrayList), rotate(ArrayList, int), shuffle(ArrayList). Тебе нужно разобраться, что делают методы, переписать их реализацию, используя при этом только соответствующие методы класса Collections.

4. Поиск элементов в коллекциях

Метод Collections.min(Collection<T> colls)

Метод min() возвращает минимальный элемент коллекции.

Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 11, 2, 23, 4, 15);

int min = Collections.min(list);

System.out.println(min);
2

Метод Collections.max(Collection<T> colls)

Метод max() возвращает максимальный элемент коллекции.

Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 11, 2, 23, 4, 15);

int max = Collections.max(list);

System.out.println(max);
23

Метод Collections.frequency(Collection<T> colls, T obj)

Метод frequency() подсчитывает, сколько раз в коллекции colls встречается элемент obj

Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 11, 2, 23, 4, 15, 4, 2, 4);

int count = Collections.frequency(list, 4);

System.out.println(count);
3

Метод Collections.binarySearch(List<T> list, T key)

Метод binarySearch() ищет элемент key в списке list. Возвращает номер найденного элемента. Если элемент не найден, возвращает отрицательное число.

Важно:
Перед вызовом метода binarySearch() список нужно отсортировать (Collections.sort()).
Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 11, 2, 23, 5, 15, 4, 2, 4);

Collections.sort(list);  // 2, 2, 4, 4, 5, 11, 15, 23

int index = Collections.binarySearch(list, 5);    // 4
System.out.println(index);

int index2 = Collections.binarySearch(list, 15);  // 6
System.out.println(index2);

int index3 = Collections.binarySearch(list, 16);  // нет
System.out.println(index3);
4
6
-8

Метод Collections.disjoint(Collection<T> coll1, Collection<T> coll2)

Метод disjoint() возвращает true, если у переданных коллекций нет одинаковых элементов.

Код Вывод на экран
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7);

ArrayList<Integer> list2 = new ArrayList<Integer>();
Collections.addAll(list2, 99, 98, 97);

boolean isDifferent = Collections.disjoint(list, list2);
System.out.println(isDifferent);
true

14
Задача
Java Syntax Pro, 14 уровень, 3 лекция
Недоступна
Изучаем методы класса Collections, часть 3
В классе Solution объявлены методы: min(ArrayList), max(ArrayList), frequency(ArrayList, Integer), binarySearch(ArrayList, Integer). Тебе нужно разобраться, что делают методы, переписать их реализацию, используя при этом только соответствующие методы класса Collec
Комментарии (365)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анна Хотькина Уровень 15
8 января 2025
Уважаемые составители заданий! Во втором задании некорректно расписана логика метода Solution.suffle(). Он может сработать неожиданным образом, если рандом выкинет два одинаковых целых числа - методом set() просто перезатрется одно (или даже несколько) значение(-ий). Загляните в оригинальный метод Collections.suffle() и вы увидите, что там используется метод swap() для коллекций. Так можно не бояться потерять данные. Еще в третьем задании касаемо метода Solution.bynarySearch() - если элемент не найден, самописный метод всегда возвращает -1, но оригинальный метод вернет отрицательный размер коллекции (как в примере в лекции вернул -8). Поддержу комментатора Kuralexer, что лучше бы задание было обратное - самому реализовать логику. Конечно, могли бы просто скопипастить из оригинального метода - но это был бы показатель, что мы знаем, как найти этот метод и, при желании, сможем разобраться, как он работает :)
Виталий Уровень 25
20 декабря 2024
Koroche, sam ne znaiet normalino
SWK Уровень 2
24 октября 2024

Метод Collections.nCopies (int n, T obj)
Метод nCopies() возвращает список из n копий элементов obj. Список можно назвать фиктивным
 (реального массива внутри нет), поэтому изменять его нельзя! Можно использовать только для
 чтения.
Реального массива нет? А что метод возвращает? В чём разница-то между "реальным массивом" и вот этим вот? Бесполезный текст, только запутывает.
rockentrav Уровень 34
14 ноября 2024
Метод Collections.nCopies(int n, T obj) возвращает неизменяемый список, состоящий из n ссылок на один и тот же объект obj. Этот метод полезен для создания "фиктивного" списка, где все элементы являются копиями одного объекта, но при этом фактически не создаётся массив или список, содержащий реальные дублированные объекты. Вместо этого возвращаемый список представляет собой специальную структуру, которая имитирует массив с n элементами без затрат на хранение каждого объекта.
Andrey Уровень 28
22 октября 2024
Не понимаю логику джавизма🤯 Ок, типа мы в нативной библиотеке сделали не особ удобную структуру данных массивы. Ну у нее неизменная длина, на практике неудобно. Вот бы иметь резиновые массивы. Ну ок, исправим ситуацию. Вот мы написали вам безразмерный  ArrayList... не благодарите) Разработчик: А почему ж у меня кидает ошибку IndexOutOfBoundsException, когда я хочу перекинуть коллекцию в пустой свежеинициализированный (безразмерный!) ArrayList? БогиЖавы: Да вы ж неправильно инициализируете нужно правильно указать размер пустого (безразмерного!) массива ну типа так

Collections.copy(new ArrayList<>(originalList.size()), originalList);
🤯 Разработчик: 🤯🤯🤯🤯 ...Они просто тролят разработчиков)))))))🤯🤯🤯
Rustam Уровень 25 Student
2 октября 2024
Вроде не особо сложно, главное методы запомнить. Чувствую, что мало кода пишу, хоть и решаю задачи здесь. У кого такая же проблема? Что делаете, чтобы набивать руку в написании кода?
Anonymous #3482594 Уровень 38
8 октября 2024
litcode в помощь
Владислав Уровень 37
16 октября 2024
codewars и просто тупо что-то себе придумывать и тестировать
mr silver Уровень 14
2 декабря 2024
да я ваще код не пишу
Rustam Уровень 25 Student
5 декабря 2024
Ну и правильно, а зачем его писать?
NightCrow Уровень 27
23 сентября 2024
На случай, если комменты вдруг прочитает аналитик\разработчик портала. Обезличьте в заданиях к этой главе названия методов и переменных. Пусть студент сам определит, что делает метод в задаче и подберет подходящий метод Collections на замену, тогда это будет и полезно и интересно.
NightCrow Уровень 27
22 сентября 2024
Перестаньте говорить "кинется исключение". Ужасно режет слух. Кидают мячик, в крайнем случае людей (на блатном жаргоне), а исключение возникает, или вызывается. Бедный русский язык.
Nazadain Уровень 39
21 октября 2024
Правильно говорить как раз-таки кинется. Слово throw буквально переводится как бросать.
NightCrow Уровень 27
21 октября 2024
Вы все всегда переводите дословно? Попробуйте перевести дословно термин deadline.
Nazadain Уровень 39
21 октября 2024
Тут дело не только в переводе. "Кинется исключение" - это сокращение от фразы "Метод выбросит исключение". Так просто короче и смысл фразы не теряется.
NightCrow Уровень 27
22 октября 2024
Бедный русский язык. Вы же не говорите в жизни, что выбросилась исключительная ситуация, верно? Вы говорите, что исключительная ситуация возникла. Ровно по этой же причине в моем примере выше, вы говорите крайний срок, а не мертвая линия. Я вот с Oracle работал с 90-х и тогда профессионалы в литературе писали, что исключение возникает, происходит или вызывается. И это, если вдуматься, верный смысловой перевод, вместо прямого машинного "выкидывается". Просто сейчас переводом занимается каждый первый, вот и имеем, что имеем.
Nazadain Уровень 39
23 октября 2024
Тут уже дело привычки я думаю. Каждый говорит, как ему больше нравится. Я отовсюду слышал именно "выброс" исключений, поэтому привык говорить так.
SWK Уровень 2
24 октября 2024
В случае с исключениями слово throw переводится на русский язык как "выбросить", а не как "бросать". Не с смысле выбросить в мусор, а в смысле "выбросить флаг", Т.е., флаг не выкидывают, а устанавливают на видное место. Как на кораблях или железной дороге. Т.е., исключение возникает или его выбрасывают. "Кинется исключение" - безграмотно.
Cryptosin Уровень 17
9 января 2025
душнила. именно так и говорится, что кидается\бросается\выкидывается исключение и дедлайн. причем тут вообще, что происходит в жизни? если речь о работе программистом
Kuralexer Уровень 14
6 сентября 2024
Вот тут я бы поставил задачу от обратного, написать самому код вместо методов Collections. Хоть какой-то толк был бы от лекции.
mrnght Уровень 28
7 июня 2024
У всех 3х задач сразу не глядя удалял весь код методов и пытался вручную реализовать их, не используя класс Collection. Это в 100 раз эффективнее для закрепления, чем просто переписать с этим классом.
Вадим М. Уровень 26 Expert
30 июля 2024
Да, но это капец как энергозатратно)))
Duxa552 Уровень 46
21 августа 2024
для такой практики есть замечательный codewars.com
Kuralexer Уровень 14
5 июня 2024
Чем дальше, тем больше новые темы вместо объяснений, как и что работает, скатываются к перечню методов.