2008-10-02 8 views
59

के लिए क्लासिकल सेट ऑपरेशंस java.util.Collection क्लास पर क्लासिकल सेट ऑपरेशंस के लिए कोई अंतर्निहित कार्यक्षमता है? मेरा विशिष्ट कार्यान्वयन ArrayList के लिए होगा, लेकिन ऐसा कुछ ऐसा लगता है जो संग्रह के सभी उप-वर्गों के लिए लागू होना चाहिए। मैं कुछ ऐसा ढूंढ रहा हूं:java.util.Collection

ArrayList<Integer> setA ... 
ArrayList<Integer> setB ... 
ArrayList<Integer> setAintersectionB = setA.intersection(setB); 
ArrayList<Integer> setAminusB = setA.subtract(setB); 

कुछ खोज के बाद, मैं केवल घर से उगाए गए समाधान ढूंढने में सक्षम था। साथ ही, मुझे एहसास है कि मैं "संग्रह" के विचार के साथ "सेट" के विचार को भ्रमित कर सकता हूं, क्रमशः डुप्लिकेट की इजाजत नहीं देता और अनुमति देता हूं। शायद यह सेट इंटरफ़ेस के लिए वास्तव में केवल कार्यक्षमता है?

अगर किसी भी अंतर्निहित कार्यक्षमता के बारे में कोई भी नहीं जानता है, तो शायद हम मानक अभ्यास जावा सेट ऑपरेशन कोड के लिए इसे एक भंडार के रूप में उपयोग कर सकते हैं? मुझे कल्पना है कि इस पहिया को कई बार पुनर्निर्मित किया गया है।

उत्तर

101

छेड़छाड़ Collection.retainAll के साथ किया जाता है; Collection.removeAll के साथ घटाव; Collection.addAll के साथ संघ। प्रत्येक मामले में, Set एक सेट की तरह कार्य करेगा और List एक सूची की तरह कार्य करेगा।

परिवर्तनीय वस्तुओं के रूप में, वे जगह पर काम करते हैं। यदि आप मूल म्यूटेबल ऑब्जेक्ट को अनम्यूटेड रखना चाहते हैं तो आपको स्पष्ट रूप से प्रतिलिपि बनाना होगा।

7

क्या आप java.util.Set इंटरफ़ेस (और इसके कार्यान्वयन हैशसेट और ट्रीसेट (क्रमबद्ध) के लिए देख रहे हैं)?
इंटरफ़ेस RemoveAll (संग्रह सी) को परिभाषित करता है जो substract(), और retainAll (संग्रह c) जैसा दिखता है जो छेड़छाड़ की तरह दिखता है।

+0

बेहतर लिंक के साथ ऐसा कर सकते हैं (जावा 6 डॉक्स) के लिए: http: //java.sun। कॉम/जावा/6/डॉक्स/एपीआई/जावा/यूज/सेट.html –

+2

अच्छा जवाब। हालांकि, ये दो सेटों में से एक को संशोधित करेंगे। यदि रॉस समाधान वाला तीसरा सेट चाहता है, तो उसे पहले क्लोन करने की आवश्यकता होगी और इसे अंतर्निहित चर के रूप में उपयोग करना होगा। –

+0

mmyer, यह इंगित करने के लिए धन्यवाद कि मेरे पास प्रोसेसिंग के साथ खेलने के लिए जावा 1.5 डॉक्स पर अभी भी एक टैब खोला गया है, और मुझे अक्सर इन डर्न फ्रेमसेट्स द्वारा काटा जाता है। लिंक तय है। – PhiLho

15

मैं Google Guava की सिफारिश करता हूं। Sets कक्षा में बिल्कुल वही लगता है जो आप खोज रहे हैं। इसमें intersection विधि और difference विधि है।

This presentation शायद कुछ ऐसा है जो आप रुचि रखते हैं तो देखना चाहते हैं। यह Google संग्रह को संदर्भित करता है, जो अमरूद का मूल नाम था।

5

उत्परिवर्ती संचालन के लिए स्वीकृत उत्तर देखें।

एक imutable संस्करण आप जावा 8

घटाव

set1 
    .stream() 
    .filter(item-> !set2.contains(item)) 
    .collect(Collectors.toSet()) 

चौराहे

set1 
    .stream() 
    .filter(item-> set2.contains(item)) 
    .collect(Collectors.toSet()) 
संबंधित मुद्दे