Операции классического набора для java.util.Collection
Есть ли встроенная функциональность для операций классического набора в классе java.util.Collection? Моя конкретная реализация будет для ArrayList, но это похоже на то, что должно применяться ко всем подклассам Collection. Я ищу что-то вроде:
ArrayList<Integer> setA ...
ArrayList<Integer> setB ...
ArrayList<Integer> setAintersectionB = setA.intersection(setB);
ArrayList<Integer> setAminusB = setA.subtract(setB);
После некоторых поисков я смог найти только домашние решения. Кроме того, я понимаю, что я, возможно, путаю идею "набора" с идеей "коллекции", не допуская и не позволяя дубликатов соответственно. Возможно, это действительно просто функциональность для интерфейса Set?
В случае, если никто не знает о каких-либо встроенных функциях, возможно, мы могли бы использовать это как репозиторий для стандартной практики Java-кода операции установки? Я думаю, что это колесо было изобретено много раз.
Ответы
Ответ 1
Пересечение выполняется с помощью Collection.retainAll
; вычитание с помощью Collection.removeAll
; объединение с Collection.addAll
. В каждом случае, поскольку Set
будет действовать как набор, а List
будет действовать как список.
Как изменчивые объекты, они работают на месте. Вам нужно будет явно скопировать, если вы хотите, чтобы исходный изменяемый объект был отключен.
Ответ 2
Я бы порекомендовал Google Guava. Класс Sets, похоже, имеет именно то, что вы ищете. Он имеет intersection и difference.
Эта презентация - это, вероятно, то, что вы хотите посмотреть, если вам интересно. Это относится к коллекциям Google, которые были оригинальным именем Guava.
Ответ 3
Вы ищете java.util.Set интерфейс (и его реализации HashSet и TreeSet (отсортированы))?
Интерфейс определяет removeAll (Collection c), который выглядит как substract() и retainAll (Collection c), который выглядит как пересечение.
Ответ 4
Для изменяемых операций см. принятый ответ.
Для варианта, который можно использовать, вы можете сделать это с помощью java 8
Вычитание
set1
.stream()
.filter(item-> !set2.contains(item))
.collect(Collectors.toSet())
пересечения
set1
.stream()
.filter(item-> set2.contains(item))
.collect(Collectors.toSet())