2010-10-24 16 views
13

मेरे पास यह सूची है:एकाधिक सेट कैसे छेड़छाड़ करें?

private List<Set<Address>> scanList; 

इसलिए मेरी सूची में कई स्कैन हैं जो आप देख सकते हैं। प्रत्येक स्कैन के बाद मैं सूची में नया सेट जोड़ता हूं।

सभी स्कैन समाप्त होने के बाद मैं केवल प्रत्येक पते में होने वाले पते लेना चाहता हूं और इसे इसमें डाल देना चाहता हूं:

private List<Address> addresses; 

क्या ऐसा कुछ सेट सेट/ट्रीसेट/हैशसेट में पहले से मौजूद है?

संपादित करें: उत्तर के बाद, retainAll() सही तरीका है। धन्यवाद। यहां स्रोत है:

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

उत्तर

13

आप retainAll(Collection<?> c) उपयोग कर सकते हैं, यह पता here

जाँच एक ओर ध्यान दें: कि आपरेशन चौराहे कहा जाता है।

इसे बदलने के लिए इसे List पर आप addAll(Collection<? extends E> c) विधि का उपयोग कर सकते हैं जो सभी प्रकार के कंटेनरों के बीच काम करना चाहिए।

जैसे:

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

Guava के साथ, आप इसे इस तरह कर सकता है:

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

यह scanList और फिर प्रतियों में सभी सेट के चौराहे के एक दृश्य बनाता में पते List में चौराहे। आपको यह सुनिश्चित करना होगा कि आपके scanList में कम से कम एक तत्व है।

+0

सावधान रहें! लुइस वासरमैन के मुताबिक, 'सेट्स.ऑनियन()' में 2 से अधिक सेटों के लिए खराब प्रदर्शन है। मेरा मानना ​​है कि यह 'Sets.intersection()' के लिए सच है (क्योंकि दोनों विधियां दृश्य वापस आती हैं)। – Gili

+0

@Gili: यह आम तौर पर सच है, हालांकि यह इस तथ्य से कम हो गया है कि अंतराल सेट को अंत में कॉपी किया गया है, जिसका अर्थ है कि नेस्टेड सेट की लागत केवल वहां होती है। नेस्टेड व्यू सेट का मुद्दा बड़ा होता है यदि आप सेट को किसी अन्य कोड पर पास करते हैं जो उस पर कई 'इन' कॉल कर सकता है। – ColinD

+0

मैं इस चर्चा में थोड़ा देर से आया हूं लेकिन यह समाधान नहीं मानता कि पहले सेट में "कुंजी" तत्व शामिल हैं। उदाहरण के लिए पूर्णांक (11,12) के साथ पहला सेट, दूसरा (1,3,4,5,6), और इसी तरह के विचार पर विचार करें। जब मैं इसे कोड करता हूं तो अंतिम बहु-छेड़छाड़ सेट खाली होता है! – user25029

संबंधित मुद्दे