2010-10-24 16 views
13

mam tę listę:Jak przecinać wiele zestawów?

private List<Set<Address>> scanList; 

Więc moja lista zawiera wiele skanów jak widać. Po każdym skanowaniu dodaję nowy zestaw do listy.

Po zakończeniu skanowania wszystkich Chciałbym podjąć tylko adresy, które występują w każdym zestawie i umieścić go w:

private List<Address> addresses; 

Czy coś takiego już istnieje w komplecie/TreeSet/Hashset?

EDYCJA: po odpowiedziach, metoda retainAll() jest właściwą metodą. Dziękuję Ci. Oto źródło:

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); 
} 

Odpowiedz

11

Zobacz "retainAll()".

13

można użyć retainAll(Collection<?> c), to sprawdzić here

bocznej uwaga: ta operacja jest nazywana skrzyżowanie.

Aby przekonwertować to na List można użyć metody addAll(Collection<? extends E> c), która powinna działać między wszystkimi rodzajami pojemników.

np

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

Z Guava, można zrobić to tak:

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); 

Stwarza to widok na przecięciu wszystkich zestawów w scanList a następnie kopiuje adresy w skrzyżowanie w List. Musisz oczywiście upewnić się, że twój scanList ma co najmniej jeden element.

+0

Uwaga! Według Louisa Wassermana 'Sets.union()' ma słabą wydajność dla więcej niż 2 zestawów. Wierzę, że to samo dotyczy 'Sets.intersection()' (ponieważ obie metody zwracają widoki). – Gili

+0

@Gili: Zasadniczo jest to prawdą, chociaż jest łagodzone przez fakt, że zbiór skrzyżowań jest kopiowany na końcu, co oznacza, że ​​koszt zestawów zagnieżdżonych jest tylko tam ponoszony. Zagadnienie zagnieżdżonych zbiorów widoków jest większe, jeśli następnie przekazujesz zestaw do innego kodu, który może wykonywać wiele wywołań "zawiera". – ColinD

+0

Do tej dyskusji doszedłem trochę późno, ale to rozwiązanie nie zakłada, że ​​pierwszy zestaw zawiera elementy "kluczowe". Weźmy na przykład pierwszy zestaw z liczbami całkowitymi (11,12), drugi z (1,3,4,5,6) i tak. Kiedy to zakodowuję, ostateczny zestaw wielu przecięć jest pusty! – user25029

Powiązane problemy