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

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

Открыта

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


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


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

Комментарии (376)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
invoker main
Уровень 42
19 сентября, 12:52
расстроило отсутствие сложных задач...
invoker main
Уровень 42
19 сентября, 12:52
расстроило отсутствие сложных задач...
23 августа, 14:29
В программировании есть начало когда начинаешь изучать программирование, а про конец можешь забыть, его нет! Удачи и терпения тем, кто не ищет легких путей :)
Anonymous #3585174
Уровень 33
4 июля, 15:47
like
Виктор
Уровень 21
14 июня, 08:42
Было бы интересно если код и название метода были перепутанны.
СемёнВрач в в деревенской поликл
23 февраля, 13:54
как работает бинарный поиск из последней задачи: У тебя есть колекция. Допустим: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} И тебе над найти элемент Х. Допустим, это будет "2". В этой колекции есть минимальный элемент "1", максимальный элемент "10" и средний элемент "5" Ты сначала сравниваешь средний элемент "5" с Х. Если совпало - збс, ты нашел. Если нет: То этот элемент Х может быть больше срединного элементе или меньше. Если он меньше - то ты будешь искать его в левой половине коллекции, если больше - в правой половине. В моем примере элемент Х это "2". А срединный элемент "5". Элемент Х меньше срединного, значит я буду продолжать поиск в левой половине коллекции. А правую половину отбрасываем нахрен. {1, 2, 3, 4, 5} Теперь в этой левой половине есть минимальный эелемент "1", и есть максимальный элемент. Максимальным элементом теперь будет тот самый срединный элемент "5". Новым срединным элементом теперь будет "3". И снова сравниваем элемент Х с срединным элементом. "2" равно "3"? нет. "2" меньше "3"? да. Значит продолжаем искать в левой половине коллекции. И отбрасываем к чертям собачим все, что справа: {1, 2, 3} Теперь в этой левой половине есть минимальный эелемент "1", и есть максимальный элемент. Максимальным элементом теперь будет тот самый срединный элемент "3". Новым срединным элементом теперь будет "2". И снова сравниваем элемент Х с срединным элементом. "2" равно "2"? Равно. Отлично! Вот и нашли
Anonymous #3312942
Уровень 32
12 февраля, 21:25
Если вы хотите сделать глубокое копирование коллекции, не задумываясь о её размерности при использовании метода Collections.copy(src,dest). Просто создайте новую коллекцию:
ArrayList<Integer> integers = new ArrayList<>(){{
    // ... список элементов
       }};
ArrayList<Integer> copyIntegers = new ArrayList<>(integers);
Ставь лайк, если было полезно.
VictorThe main expert in Automa в Строительная компани
25 января, 16:42
Третья задача "Изучаем методы класса Collections, часть 3" . Реализацию поиска через while даже разбирать не хочу - надоело в прошлой жизни, метод Collections.binarySearch справляется прекрасно, всё коротко, а главное наглядно и понятно.
VictorThe main expert in Automa в Строительная компани
25 января, 16:28
Во второй задаче даже разбираться не стал в этих извращениях, зачем, если есть такие прекрасные для этих случаев методы Collections. Вставил их - всё заработало.
VictorThe main expert in Automa в Строительная компани
25 января, 16:18
По первому заданию "Изучаем методы класса Collections, часть 1" согласен - с помощью методов Collections код стал короче, а главное более понятным - что происходит и для чего.