2013-09-05 8 views
80

के बीच का अंतर तो मैं दो सेट है यदि:हो रही दो सेट

Set<int> test1 = new HashSet<Integer>(); 
test1.add(1); 
test1.add(2); 
test1.add(3); 

Set<int> test2 = new HashSet<Integer>(); 
test2.add(1); 
test2.add(2); 
test2.add(3); 
test2.add(4); 
test2.add(5); 

वहाँ उनकी तुलना करने और केवल 4 और 5 का एक सेट लौटे एक तरीका है?

+0

http://stackoverflow.com/questions/8064570/what-is-the-best-way-get-the-symmetric-difference-between-two-sets-in-java –

+9

का संभावित डुप्लिकेट यह नहीं है एक सटीक डुप्लिकेट: सममित अंतर और अंतर समान नहीं हैं। –

+0

यदि 'test1' में' 6' है, तो क्या उत्तर 4,5,6 होगा? यानी आप सममित अंतर चाहते हैं http://en.wikipedia.org/wiki/Symmetric_difference –

उत्तर

110

इस

test2.removeAll(test1); 

Set#removeAll

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

+20

यह काम करेगा लेकिन मुझे लगता है कि यह एक अच्छा होगा संघ में सेट ऑपरेशन, जावा में निर्मित अंतर के लिए सुविधा। उपर्युक्त समाधान सेट को संशोधित करेगा, कई परिस्थितियों में हम वास्तव में यह नहीं चाहते हैं। –

+41

जावा को इस डेटा संरचना को 'सेट' कहने के लिए पित्त कैसे हो सकता है जब यह 'संघ', 'चौराहे' या 'अंतर' को परिभाषित नहीं करता है !!! –

+6

यह समाधान पूरी तरह से सही नहीं है। क्योंकि test1 और test2 का क्रम एक फर्क पड़ता है। –

11

हाँ:

test2.removeAll(test1) 

इस हालांकि test2 उत्परिवर्तित, इसलिए यदि आप इसे संरक्षित करने की जरूरत है एक प्रतिलिपि बना देगा।

इसके अलावा, आप शायद <int> के बजाय <Integer> का मतलब था।

5

आप जावा 8 का उपयोग कर रहे हैं, तो आप कुछ इस तरह की कोशिश कर सकते:

SetView<Number> difference = com.google.common.collect.Sets.difference(test2, test1); 

:

public Set<Number> difference(final Set<Number> set1, final Set<Number> set2){ 
    final Set<Number> larger = set1.size() > set2.size() ? set1 : set2; 
    final Set<Number> smaller = larger.equals(set1) ? set2 : set1; 
    return larger.stream().filter(n -> !smaller.contains(n)).collect(Collectors.toSet()); 
} 
+4

@Downvoter: शायद आप यह महसूस करने में नाकाम रहे हैं कि अन्य उत्तरों यह देखने के लिए जांच नहीं करते कि कौन सा 'सेट' बड़ा है ... इसलिए, यदि आप बड़े' सेट 'से छोटे' सेट 'को घटाते हैं, तो आप विभिन्न परिणाम प्राप्त करेंगे। –

+20

आप मानते हैं कि उस फ़ंक्शन का उपभोक्ता हमेशा छोटे सेट को घटाना चाहता है। अंतर अंतर anticommutative (http://en.wikipedia.org/wiki/Anticommutativity) है। ए-बी!= बी-ए – Simon

+5

भले ही आप किस अंतर का कार्यान्वयन करते हैं, मैं 'सार्वजनिक स्थैतिक सेट अंतर (अंतिम सेट सेट 1, अंतिम सेट सेट 2) {' हस्ताक्षर के रूप में, विधि जेनेरिक उपयोगिता फ़ंक्शन के रूप में उपयोग करने योग्य है। – kap

71

आप अमरूद (पूर्व गूगल संग्रह) पुस्तकालय का उपयोग करते हैं वहाँ एक समाधान है SetView वापस Set है, यह एक लाइव प्रतिनिधित्व है जिसे आप या तो अपरिवर्तनीय बना सकते हैं या किसी अन्य सेट पर प्रतिलिपि बना सकते हैं। test1 और test2 बरकरार रखा गया है।

+0

ध्यान दें कि [ऑर्डर] (https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Sets.html#difference (java.util.Set,% 20java .util.Set)) test2 और test1 मामलों के। वहां भी है [symmetricDifference()] (https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Sets.html#symmetricDifference (java.util.Set,% 20java.util.Set)) जहां आदेश कोई फर्क नहीं पड़ता। – datv

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