मैं कहूंगा कि ये उत्तर एक चाल याद करते हैं।
बलोच, अपने आवश्यक, अद्भुत, संक्षिप्त प्रभावी जावा में , कहते हैं, आइटम 47 में, "पुस्तकालयों को जानें और उपयोग करें" शीर्षक, "संक्षेप में कहें, पहिया को सुदृढ़ न करें"। और वह कई बहुत स्पष्ट कारण देता है कि क्यों नहीं।
यहाँ कुछ उत्तर दिए गए हैं जो CollectionUtilsअपाचे कॉमन्स कलेक्शंस लाइब्रेरी में दिए गए तरीकों के बारे में बताते हैं लेकिन किसी ने भी इस सवाल का जवाब देने का सबसे सुंदर, सुरुचिपूर्ण तरीका नहीं देखा है :
Collection<Object> culprits = CollectionUtils.disjunction( list1, list2 );
if( ! culprits.isEmpty() ){
// ... do something with the culprits, i.e. elements which are not common
}
Culprits : यानी जो तत्व दोनों के लिए आम नहीं हैं Lists। यह निर्धारित करना कि कौन से अपराधी हैं list1और कौन सा list2अपेक्षाकृत सीधा उपयोग कर रहा है CollectionUtils.intersection( list1, culprits )और CollectionUtils.intersection( list2, culprits )।
हालाँकि यह {"a", "a", "b"} disjunctionजैसे {"a", "b", "b"} जैसे मामलों में अलग हो जाता है ... सिवाय इसके कि यह सॉफ्टवेयर की विफलता नहीं है, लेकिन वांछित कार्य की सूक्ष्मताओं / अस्पष्टताओं की प्रकृति के निहित है।
आप इस तरह के कार्य के लिए हमेशा स्रोत कोड (l 287) की जांच कर सकते हैं , जैसा कि अपाचे इंजीनियरों द्वारा उत्पादित किया गया है। उनके कोड का उपयोग करने का एक लाभ यह है कि इसे पूरी तरह से आजमाया और परखा जाएगा, जिसमें कई किनारे के मामले और गेटेक प्रत्याशित और निपटाए जाएंगे। यदि आवश्यक हो तो आप इस कोड को अपने दिल की सामग्री पर कॉपी और ट्विक कर सकते हैं।
नायब I पहली बार निराश हुआ कि कोई भी CollectionUtilsतरीका एक अतिभारित संस्करण प्रदान नहीं करता है जो आपको अपना स्वयं का थोपने में सक्षम बनाता है Comparator(ताकि आप equalsअपने उद्देश्यों के अनुरूप पुनर्परिभाषित कर सकें )।
लेकिन संग्रह 4 4.0 से एक नया वर्ग है, Equatorजो "टाइप टी की वस्तुओं के बीच समानता को निर्धारित करता है"। Collection4 CollectionUtils.java के स्रोत कोड की जांच करने पर वे कुछ विधियों के साथ इसका उपयोग करते प्रतीत होते हैं, लेकिन जहां तक मैं यह बता सकता हूं कि यह CardinalityHelperकक्षा के उपयोग से फ़ाइल के शीर्ष पर मौजूद तरीकों पर लागू नहीं है ... जो शामिल disjunctionऔर intersection।
मुझे लगता है कि अपाचे लोगों को इसके आसपास अभी तक नहीं मिला है क्योंकि यह गैर-तुच्छ है: आपको "AbstractEquatingCollection" वर्ग की तरह कुछ बनाना होगा, जो इसके तत्वों के अंतर्निहित equalsऔर hashCodeतरीकों का उपयोग करने के बजाय उन का उपयोग करना होगा। की Equatorतरह के रूप में सभी बुनियादी तरीकों, के लिए add, containsआदि नायब वास्तव में जब आप स्रोत कोड को देखो, AbstractCollectionको लागू नहीं करता है add, और न ही इस तरह के रूप में अपनी सार उपवर्गों करना AbstractSet... आप इस तरह के रूप में ठोस वर्ग तक इंतजार करना पड़ता है HashSetऔर ArrayListइससे पहले कि addलागू किया गया है। काफी सिरदर्द।
इस समय में इस स्थान को देखो, मुझे लगता है। स्पष्ट अंतरिम समाधान एक bespoke आवरण वर्ग में अपने सभी तत्वों को लपेटना होगा जो उपयोग करता है equalsऔर hashCodeजिस तरह की समानता आप चाहते हैं उसे लागू करने के लिए ... फिर Collectionsइन आवरण वस्तुओं का हेरफेर करें।