Классические операции над множествами для java.util.Collection - PullRequest
62 голосов
/ 02 октября 2008

Есть ли встроенная функциональность для классических операций над множествами в классе 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? Я полагаю, это колесо было изобретено много раз.

Ответы [ 4 ]

108 голосов
/ 02 октября 2008

Пересечение выполняется с Collection.retainAll; вычитание с Collection.removeAll; союз с Collection.addAll. В каждом случае Set будет действовать как набор, а List будет действовать как список.

Как изменчивые объекты, они работают на месте. Вам нужно будет явно скопировать, если вы хотите сохранить исходный изменяемый объект без изменений.

15 голосов
/ 02 октября 2008

Я бы порекомендовал Google Guava . Класс Sets , кажется, имеет именно то, что вы ищете. У него есть метод пересечения и метод разница .

Эта презентация , вероятно, вы хотите посмотреть, если вам интересно. Это относится к Google Collections, которая была оригинальным названием Guava.

7 голосов
/ 23 декабря 2015

Изменяемые операции см. В принятом ответе.

Для изменяемого варианта вы можете сделать это с помощью Java 8

Вычитание

set1
  .stream()
  .filter(item-> !set2.contains(item))
  .collect(Collectors.toSet())

пересечение

set1
  .stream()
  .filter(item-> set2.contains(item))
  .collect(Collectors.toSet())
7 голосов
/ 02 октября 2008

Вы ищете java.util.Set интерфейс (и его реализации HashSet и TreeSet (отсортировано))?
Интерфейс определяет removeAll (Collection c), который выглядит как substract (), и retainAll (Collection c), который выглядит как пересечение.

...