web-dev-qa-db-fra.com

Opérations d'ensemble classiques pour Java.util.Collection

Existe-t-il une fonctionnalité intégrée pour les opérations d'ensemble classiques sur la classe Java.util.Collection? Mon implémentation spécifique serait pour ArrayList, mais cela ressemble à quelque chose qui devrait s'appliquer à toutes les sous-classes de Collection. Je cherche quelque chose comme:

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

Après quelques recherches, je n'ai pu trouver que des solutions locales. De plus, je me rends compte que je peux confondre l'idée d'un "ensemble" avec l'idée d'une "collection", ne permettant pas et n'autorisant pas les doublons respectivement. Peut-être que ce n'est vraiment qu'une fonctionnalité pour l'interface Set?

Dans le cas où personne ne connaît de fonctionnalité intégrée, nous pourrions peut-être l'utiliser comme référentiel pour la pratique standard Java définir le code d'opération? J'imagine que cette roue a été réinventée plusieurs fois.

62
Ross

L'intersection se fait avec Collection.retainAll; soustraction avec Collection.removeAll; union avec Collection.addAll. Dans chaque cas, comme Set agira comme un ensemble et un List agira comme une liste.

En tant qu'objets mutables, ils fonctionnent en place. Vous devrez copier explicitement si vous souhaitez conserver l'objet mutable d'origine non muté.

108

Je recommanderais Google Guava . La classe Sets semble avoir exactement ce que vous recherchez. Il a une méthode intersection et une méthode différence .

Cette présentation est probablement quelque chose que vous voulez regarder si cela vous intéresse. Il fait référence à Google Collections, qui était le nom d'origine de Guava.

15
Benno Richters

Recherchez-vous l'interface Java.util.Set (et ses implémentations HashSet et TreeSet (triées))?
L'interface définit removeAll (Collection c) qui ressemble à substract (), et retentionAll (Collection c) qui ressemble à l'intersection.

7
PhiLho

Pour les opérations mutables, voir la réponse acceptée.

Pour une variante immuable, vous pouvez le faire avec Java 8

soustraction

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

intersection

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