मैं कहूंगा कि ये उत्तर एक चाल याद करते हैं।
बलोच, अपने आवश्यक, अद्भुत, संक्षिप्त प्रभावी जावा में , कहते हैं, आइटम 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
इन आवरण वस्तुओं का हेरफेर करें।