2012-01-30 14 views
48

मुझे अनावश्यक जानकारी फ़िल्टर करते समय दो स्ट्रिंग सेट को गठबंधन करने की आवश्यकता है, यह वह समाधान है जिसके साथ मैं आया था, क्या कोई बेहतर तरीका है कि कोई भी सुझाव दे सकता है? शायद उसमें निर्मित कुछ मैंने अनदेखा किया? गूगल के साथ कोई भाग्य नहीं था।जावा में दो स्ट्रिंग सेट को गठबंधन करने का कोई बेहतर तरीका है?

Set<String> oldStringSet = getOldStringSet(); 
Set<String> newStringSet = getNewStringSet(); 

for(String currentString : oldStringSet) 
{ 
    if (!newStringSet.contains(currentString)) 
    { 
     newStringSet.add(currentString); 
    } 
} 

उत्तर

83

एक Set के बाद से डुप्लिकेट प्रविष्टियों शामिल नहीं है, इसलिए आप को जोड़ सकते हैं दो द्वारा:

newStringSet.addAll(oldStringSet); 

अगर आप चीजों को दो बार जोड़ना कोई फर्क नहीं पड़ता, सेट केवल तत्व एक बार में शामिल होंगे ... उदाहरण के लिए contains विधि का उपयोग करने की जांच करने की आवश्यकता नहीं है।

4

बस newStringSet.addAll(oldStringSet) का उपयोग करें। Set कार्यान्वयन के रूप में डुप्लिकेट की जांच करने की कोई आवश्यकता नहीं है।

2

Set.addAll()

इस सेट करने के लिए निर्दिष्ट संग्रह में सभी तत्त्व जोड़ता है अगर वे पहले से ही मौजूद है (वैकल्पिक आपरेशन) नहीं कर रहे हैं। यदि निर्दिष्ट संग्रह भी एक सेट है, addAll आपरेशन प्रभावी रूप से इतना है कि अपने मूल्य दो सेट

newStringSet.addAll(oldStringSet)

2

के मिलन का प्रयोग करें boolean addAll(Collection<? extends E> c)
है इस सेट को संशोधित निर्दिष्ट संग्रह में सभी तत्त्व जोड़ता है इस सेट पर अगर वे पहले से मौजूद नहीं हैं (वैकल्पिक ऑपरेशन)। यदि निर्दिष्ट संग्रह भी एक सेट है, तो addAll ऑपरेशन प्रभावी रूप से इस सेट को संशोधित करता है ताकि उसका मान दो सेटों का संघ हो। ऑपरेशन चालू होने पर निर्दिष्ट संग्रह संशोधित किया गया है, तो इस ऑपरेशन का व्यवहार अपरिभाषित है।

newStringSet.addAll(oldStringSet) 
3
newStringSet.addAll(oldStringSet); 

इस के एस 1 और s2

9

परिभाषा सेट से केवल अद्वितीय तत्व होते हैं संघ का उत्पादन करेगा।

Set<String> distinct = new HashSet<String>(); 
distinct.addAll(oldStringSet); 
distinct.addAll(newStringSet); 

अपने कोड बढ़ाने के लिए आपको लगता है कि

public static <T> Set<T> distinct(Collection<T>... lists) { 
    Set<T> distinct = new HashSet<T>(); 

    for(Collection<T> list : lists) { 
     distinct.addAll(list); 
    } 
    return distinct; 
} 
28

के लिए एक सामान्य विधि आप एक स्थिर आयात के साथ इस एक लाइनर

Set<String> combined = Stream.concat(newStringSet.stream(), oldStringSet.stream()) 
     .collect(Collectors.toSet()); 

का उपयोग कर ऐसा कर सकते हैं बना सकते हैं तो यह और भी अच्छा लग रहा है

Set<String> combined = concat(newStringSet.stream(), oldStringSet.stream()) 
     .collect(toSet()); 

एक और तरीका टी है ओ का उपयोग flatMap विधि:

Set<String> combined = Stream.of(newStringSet, oldStringSet).flatMap(Set::stream) 
     .collect(toSet()); 

इसके अलावा किसी भी संग्रह आसानी से एक सिंगल तत्व

Set<String> combined = concat(newStringSet.stream(), Stream.of(singleValue)) 
     .collect(toSet()); 
+0

कैसे इस addAll से बेहतर है? – KKlalala

5

Guava के साथ एक ही साथ जोड़ा जा सकता:

Set<Sting> combinedSet = Sets.union(oldStringSet, newStringSet) 
संबंधित मुद्दे