2010-10-24 26 views
13

Bu listeye sahibim:Birden fazla set nasıl kesişir?

private List<Set<Address>> scanList; 

Bu yüzden listemde gördüğünüz gibi çoklu taramalar var. Her taramadan sonra listeye yeni set ekliyorum.

Tüm taramalar bittikten sonra sadece her sette ortaya çıkan adresleri alıp içine koyarım:

private List<Address> addresses; 

Set/TreeSet/HashSet'te böyle bir şey zaten var mı?

DÜZENLEME: cevaplardan sonra retainAll() doğru yöntemdir. Teşekkür ederim. İşte kaynak:

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

cevap

11

Bkz "retainAll()": İşte kaynağıdır.

13

sen retainAll(Collection<?> c) kullanabilirsiniz dışarı here

Bir yan not kontrol: o operasyon kesişme denir.

List ürününe dönüştürmek için, her türlü kapsayıcı arasında çalışması gereken addAll(Collection<? extends E> c) yöntemini kullanabilirsiniz.

örn: Guava ile

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

, bunu şöyle yapabilirsiniz:

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

Bu scanList ardından kopya tüm kümelerin kesişim bir görünüm yaratır adresleri de List içine kesişim. Elbette, scanList'un en az bir elemanı olduğundan emin olmanız gerekir.

+0

Dikkat! Louis Wasserman'a göre 'Sets.union()' 2'den fazla takım için zayıf performansa sahiptir. Aynı şey 'Sets.intersection() 'için de geçerli olduğuna inanıyorum (çünkü her iki yöntem de görünümleri döndürür). – Gili

+0

@Gili: Bu genellikle, kesişim kümesinin en sonunda kopyalandığı gerçeğiyle azaltılacak olsa da, yani yuvalanmış kümelerin maliyetinin sadece burada meydana geldiği anlamına gelir. İç içe geçmiş görünüm kümeleri sorunu, daha sonra kümeyi, üzerinde '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'çağrısı yapabilecek başka bir koda geçirirseniz daha büyüktür – ColinD

+0

Bu tartışmaya biraz geç geldim ama bu çözüm ilk kümenin "anahtar" öğeleri içerdiğini varsaymıyor. Örneğin, ilk seti tam sayılarla (11,12), 2. ile (1,3,4,5,6), vb. Düşünün. Bunu kodladığım zaman son çoklu kesişim kümesi boş! – user25029

İlgili konular