2010-10-24 13 views
13

Ho questa lista:Come intersecare più set?

private List<Set<Address>> scanList; 

Quindi la mia lista contiene più scansioni, come potete vedere. Dopo ogni scansione aggiungo un nuovo set alla lista.

Dopo tutte le scansioni sono finiti vorrei prendere solo gli indirizzi che si verificano in ogni set e metterlo in:

private List<Address> addresses; 

fa qualcosa del genere esiste già Set/TreeSet/HashSet?

MODIFICA: dopo le risposte, retainAll() è il metodo corretto. Grazie. Qui è la fonte:

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

risposta

11

Vedere "retainAll()".

13

è possibile utilizzare retainAll(Collection<?> c), check it out here

Una nota a margine: che l'operazione si chiama intersezione.

Per convertirlo in un List è possibile utilizzare il metodo addAll(Collection<? extends E> c) che dovrebbe funzionare tra tutti i tipi di contenitori.

esempio:

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

Con Guava, si poteva fare in questo modo:

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

Questo crea una vista della intersezione di tutti i set nelle scanList e quindi copia gli indirizzi in l'intersezione in List. Dovresti assicurarti che il tuo scanList contenga almeno un elemento, ovviamente.

+0

Attenzione! Secondo Louis Wasserman, 'Sets.union()' ha scarse prestazioni per più di 2 set. Credo che lo stesso sia vero per 'Sets.intersection()' (perché entrambi i metodi restituiscono viste). – Gili

+0

@Gili: Questo è generalmente vero, sebbene sia mitigato dal fatto che il set di intersezioni viene copiato alla fine, il che significa che il costo degli insiemi nidificati è solo sostenuto lì. Il problema dei set di viste nidificate è maggiore se si passa il set off ad un altro codice che potrebbe eseguire molte chiamate 'contains' su di esso. – ColinD

+0

Sono arrivato a questa discussione un po 'tardi, ma questa soluzione non presuppone che il primo set contenga gli elementi "chiave". Ad esempio, considera il primo set con numeri interi (11,12), il secondo con (1,3,4,5,6) e così via. Quando scrivo questo codice, l'insieme multi-intersezione finale è vuoto! – user25029