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