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