2010-10-24 7 views
13

J'ai cette liste:Comment couper plusieurs ensembles?

private List<Set<Address>> scanList; 

Ma liste contient plusieurs scans que vous pouvez voir. Après chaque analyse, j'ajoute un nouvel ensemble dans la liste.

Après toutes les analyses sont terminées, je voudrais prendre que les adresses qui se produisent dans chaque ensemble et le mettre dans:

private List<Address> addresses; 

Est-ce que quelque chose comme cela existe déjà dans Set/TreeSet/HashSet?

EDIT: après les réponses, retainAll() est la bonne méthode. Je vous remercie. Voici la source:

Set<Address> addressCross = scanList.get(0); 
for (int i = 1; i < scanList.size(); i++) { 
    addressCross.retainAll(scanList.get(i)); 
} 
for (Address address : addressCross) { 
    addresses.add(address); 
} 

Répondre

11

Voir "retainAll()".

13

vous pouvez utiliser retainAll(Collection<?> c), vérifier here

Une note de côté: cette opération est appelée intersection.

Pour convertir ensuite à List vous pouvez utiliser la méthode addAll(Collection<? extends E> c) qui devrait fonctionner entre tous les types de conteneurs.

par exemple:

ArrayList<Address> list = new ArrayList<Address>(); 
list.addAll(yourSet); 
5

Avec Guava, vous pourriez le faire comme ceci:

Set<Address> intersection = scanList.get(0); 
for (Set<Address> scan : scanList.subList(1, scanList.size())) { 
    intersection = Sets.intersection(intersection, scan); 
} 
List<Address> addresses = Lists.newArrayList(intersection); 

Cela crée une vue de l'intersection de tous les ensembles dans les scanList puis copie les adresses l'intersection en List. Vous devez vous assurer que votre scanList a au moins un élément, bien sûr.

+0

Attention! Selon Louis Wasserman, 'Sets.union()' a de mauvaises performances pour plus de 2 sets. Je crois que la même chose est vraie pour 'Sets.intersection()' (parce que les deux méthodes retournent des vues). – Gili

+0

@Gili: Ceci est généralement vrai, bien qu'il soit atténué par le fait que l'ensemble d'intersection est copié à la fin, ce qui signifie que le coût des ensembles imbriqués est seulement encouru là. Le problème des ensembles de vues imbriqués est plus important si vous passez ensuite le jeu à un autre code qui peut faire plusieurs appels 'contains'. – ColinD

+0

Je suis arrivé à cette discussion un peu en retard, mais cette solution ne suppose-t-elle pas que le premier ensemble contient les éléments «clés». Par exemple, considérons le premier ensemble avec des entiers (11,12), le second avec (1,3,4,5,6), et ainsi de suite. Quand je code ceci, l'ensemble multi-intersection final est vide! – user25029

Questions connexes