2012-01-03 10 views
199

मेरे पास एक ही प्रकार के दो सेट, ए और बी हैं।जावा सेट के लिए 'कोई भी शामिल है' जैसे कुछ?

मैं अगर एक सेट बी

क्या ऐसा करने के लिए सेट पर पुनरावृत्ति के बिना सबसे अच्छा तरीका है से किसी भी तत्व शामिल खोजने के लिए? सेट लाइब्रेरी में contains(object) और containsAll(collection) है, लेकिन containsAny(collection) नहीं है।

+3

क्या आप दक्षता कारणों से या कोड सफाई के लिए पुन: प्रयास करने से बचने की कोशिश कर रहे हैं? – yshavit

+0

उत्तर देखकर मैं इस विधि को पसंद करूंगा यदि यह अस्तित्व में था ... अच्छा सवाल। – qben

उत्तर

354

चाहेंगे नहीं Collections.disjoint(A, B) काम देखते हैं? प्रलेखन से:

true लौटाता है यदि दो निर्दिष्ट संग्रहों में कोई तत्व सामान्य नहीं है।

इस प्रकार, विधि में false देता है यदि संग्रह में कोई सामान्य तत्व होता है।

+8

इसे अन्य समाधानों के लिए पसंद करें क्योंकि यह किसी भी सेट को संशोधित नहीं करता है या एक नया बनाता है। – devconsole

+0

और यह भी एक तेज़ समाधान ... – Yura

+2

और मानक जेआरई है, और किसी भी संग्रह के साथ काम करता है, बस सेट नहीं। –

3

आप retainAll विधि का उपयोग कर सकते हैं और अपने दो सेटों का चौराहे प्राप्त कर सकते हैं।

+0

ज्यादातर मामलों में किसी को मूल सेट रखने की आवश्यकता होती है, इसलिए 'retainAll' का उपयोग करने के लिए मूल सेट की एक प्रति बनाना आवश्यक है। फिर [Zéychin] (http://stackoverflow.com/a/8708783/1333025) द्वारा सुझाए गए अनुसार 'हैशसेट' का उपयोग करना अधिक कुशल है। –

5

सेट इंटरफ़ेस में retainAll() का उपयोग करें। यह विधि दोनों सेटों में आम तत्वों का एक चौराहे प्रदान करती है। अधिक जानकारी के लिए एपीआई दस्तावेज़ देखें।

+0

यदि पुनरावृत्ति से बचने का बिंदु दक्षता के लिए है, तो 'retainAll' शायद मदद नहीं करेगा। 'सारकोलेक्शन' में इसका कार्यान्वयन पुनरावृत्त होता है। – yshavit

+1

yshavit सही है। यह देखते हुए कि ओपी यह देखने के लिए देख रहा है कि ** ** ** ** दोनों सेटों में कोई ** तत्व मौजूद है, तो उचित एल्गोरिदम में सर्वोत्तम मामले में 'ओ (1)' चलने का समय होगा, जबकि 'retainAll' के साथ कुछ होगा एक 'ओ (एन) '(यह केवल 1 सेट के आकार पर निर्भर करेगा) सर्वोत्तम मामले चलने का समय। –

3

मैं सेट एक से एक HashMap बनाने की सलाह देते हैं, और फिर सेट बी के माध्यम से पुनरावृत्ति और अगर बी के किसी भी तत्व ए में है यह O(|A|+|B|) समय में किये हैं (जैसा कि वहाँ कोई टकराव होगा) की जाँच, जबकि retainAll(Collection<?> c) चलाना चाहिए O(|A|*|B|) समय में।

3

ऐसा करने के लिए थोड़ा मोटा तरीका है। हैं और केवल यदि एक सेट एक सेट को संशोधित करेगा कॉल

A.removeAll(B) 

की तुलना में कुछ बी के तत्व शामिल हैं। इस स्थिति में हटाएं सभी सच हो जाएंगे (जैसा कि removeAll docs पर बताया गया है)। लेकिन शायद आप एक सेट करके इस तरह की तरह, एक प्रति पर कार्य करने के बारे में सोच सकते संशोधित करने के लिए नहीं करना चाहती:

new HashSet(A).removeAll(B) 

और लौटने मान हमेशा सही है, तो सेट अलग नहीं कर रहे हैं हो जाएगा, कि वे है गैर खाली चौराहे है।

इसके अलावा Apache Commons Collections

23

लागू करने के लिए एक अच्छा तरीका है सेट के लिए कोई भी Guava Sets.intersection() का उपयोग कर रहा है।

containsAny एक boolean वापसी होगी, तो कॉल की तरह दिखता है:

Sets.intersection(set1, set2).isEmpty() 

यह सच रिटर्न iff सेट संबंध तोड़ना हैं, अन्यथा गलत। इसकी समय जटिलता बरकरार रखने की अपेक्षा थोड़ा बेहतर है क्योंकि आपको अपने मूल सेट को संशोधित करने से बचने के लिए कोई क्लोनिंग नहीं करना है।

+2

इस दृष्टिकोण का उपयोग करने का एकमात्र नुकसान यह है कि आपको अमरूद पुस्तकालयों को शामिल करना होगा। जो मुझे लगता है कि नुकसान नहीं है क्योंकि Google संग्रह API बहुत मजबूत हैं। –

69

जावा 8 के बाद से: setA.stream().anyMatch(setB::contains)

+0

यह वही है जो मैं ढूंढ रहा था! धन्यवाद :-) मुझे यह भी नहीं पता था कि आप :: वाक्यविन्यास के साथ चर का उपयोग कर सकते हैं! – dantiston

+1

@blevert, क्या आप समझा सकते हैं कि किसी भी मैच के अंदर क्या होता है? – Cristiano

+3

@ क्रिस्टियानो, 'anyMatch'' setA' के सभी तत्वों को स्ट्रीम करेगा और उन सभी पर 'setB.contains()' को कॉल करेगा। यदि किसी भी तत्व के लिए "सत्य" वापस किया जाता है, तो पूरी तरह से अभिव्यक्ति सत्य का मूल्यांकन करेगी। उम्मीद है कि यह मदद की। –

3

मैं org.apache.commons.collections का उपयोग करें।CollectionUtils

CollectionUtils.containsAny(someCollection1, someCollection2) 

सभी है! सच देता है यदि कम से कम एक तत्व दोनों संग्रहों में है।

उपयोग करने में आसान, और फ़ंक्शन का नाम अधिक जानकारीपूर्ण है।

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