2008-10-02 12 views
59

Есть ли встроенная функциональность для классических операций набора в классе java.util.Collection? Моя конкретная реализация будет для ArrayList, но это похоже на то, что должно применяться ко всем подклассам Collection. Я ищу что-то вроде:Операции с классическим набором для java.util.Collection

ArrayList<Integer> setA ... 
ArrayList<Integer> setB ... 
ArrayList<Integer> setAintersectionB = setA.intersection(setB); 
ArrayList<Integer> setAminusB = setA.subtract(setB); 

После некоторых поисков я смог найти только домашние решения. Кроме того, я понимаю, что я, возможно, путаю идею «набора» с идеей «коллекции», не допуская и не позволяя дубликатов соответственно. Возможно, это действительно просто функциональность для интерфейса Set?

В случае, если никто не знает каких-либо встроенных функций, возможно, мы могли бы использовать это как репозиторий для стандартной практики Java, заданного операционным кодом? Я думаю, что это колесо было изобретено много раз.

ответ

101

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

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

7

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

+0

Лучше ссылка (Java 6 Документов): HTTP: //java.sun. com/javase/6/docs/api/java/util/Set.html – 2008-10-02 19:12:17

15

Я бы порекомендовал Google Guava. Класс Sets, похоже, имеет именно то, что вы ищете. Он имеет метод intersection и метод difference.

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

5

Для изменчивых операций см. Принятый ответ.

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

вычитания

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

пересечения

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