Подтвердить что ты не робот

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

4b9b3361

Ответ 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())