Часто в программировании на языке Java возникает задача, когда имеются два набора данных одного типа и необходимо выяснить, содержит ли первый набор хотя бы один элемент из второго набора. Например, имеются два набора чисел, и требуется определить, есть ли общие числа среди них.
В Java для работы с наборами данных используются коллекции типа Set. Однако, стандартные методы этого интерфейса позволяют проверить, содержит ли набор определенный объект или все объекты из другой коллекции, но не предоставляют возможности проверить, содержит ли набор хотя бы один объект из другой коллекции.
Set<Integer> setA = new HashSet<>(); Set<Integer> setB = new HashSet<>(); // Заполняем наборы setA.add(1); setA.add(2); setA.add(3); setB.add(3); setB.add(4); setB.add(5); // Проверяем, содержит ли набор setA числа из набора setB boolean containsAll = setA.containsAll(setB); // вернет false
Так как стандартный метод containsAny(collection)
отсутствует, нужно использовать другие подходы.
Один из возможных вариантов решения — использовать метод retainAll(collection)
, который оставляет в наборе только те элементы, которые присутствуют в указанной коллекции. Если после применения этого метода размер набора уменьшился, значит в нем были элементы из другого набора.
Set<Integer> setC = new HashSet<>(setA); // создаем копию набора setC.retainAll(setB); // оставляем в наборе только общие элементы boolean containsAny = !setC.isEmpty(); // если набор не пуст, значит есть общие элементы
Несмотря на то, что данный подход решает поставленную задачу, он изменяет исходный набор, что может быть нежелательно в некоторых случаях. В таких ситуациях придется создавать копию набора, что приводит к дополнительным затратам памяти.
Если изменение исходного набора недопустимо, а создание копии нежелательно, можно воспользоваться методами класса Collections
. В частности, метод disjoint(collection1, collection2)
возвращает true
, если две коллекции не имеют общих элементов, и false
в противном случае.
boolean containsAny = !Collections.disjoint(setA, setB); // вернет true, если есть общие элементы
Этот подход не изменяет исходные наборы и не требует создания дополнительных копий, что делает его более предпочтительным в большинстве случаев.
Добавить комментарий