सवाल जांचें कि एक सूची में दूसरे से तत्व शामिल है या नहीं


मेरे पास अलग-अलग वस्तुओं के साथ दो सूचियां हैं।

List<Object1> list1;
List<Object2> list2;

मैं यह जांचना चाहता हूं कि विशिष्ट विशेषता (ऑब्जेक्ट 1 और ऑब्जेक्ट 2 में (दूसरों के बीच), एक पारस्परिक विशेषता (टाइप लॉन्ग के साथ) विशेषता सूची के आधार पर सूची 1 में तत्व सूची 1 में मौजूद है या नहीं।

अभी, मैं इसे इस तरह करता हूं:

boolean found = false;
for(Object1 object1 : list1){
   for(Object2 object2: list2){
       if(object1.getAttributeSame() == object2.getAttributeSame()){
           found = true;
           //also do something
       }
    }
    if(!found){
        //do something
    }
    found = false;
}

लेकिन मुझे लगता है कि ऐसा करने के लिए एक बेहतर और तेज़ तरीका है :) क्या कोई इसका प्रस्ताव दे सकता है?

धन्यवाद!


76
2017-08-03 13:08


मूल


सबसे पहले, जब आप पाए गए = सत्य; तो बस तोड़ो; या लूप से बाहर आओ - Shubhansh
stackoverflow.com/questions/5187888/...। इसके अलावा, तेजी से खोज के लिए बाइनरी खोज का उपयोग करने का प्रयास करें और स्थिति को सुइट करने के लिए अपने डीएस को बदलें ... - Shubhansh
क्या वे ऑब्जेक्ट के अलावा एक आम माता-पिता साझा करते हैं? - Woot4Moo
@ Woot4Moo नहीं, वे नहीं करते हैं - Ned


जवाब:


यह एक पंक्ति में इनपुट सूचियों को संशोधित किए बिना बुनियादी जेडीके के साथ किया जा सकता है

!Collections.disjoint(list1, list2);

160
2017-08-03 15:59



क्या यह हमेशा झूठी वापसी नहीं करेगा क्योंकि दोनों 2 अलग-अलग वस्तुएं हैं? - Venki
उम नहीं? यदि कोई ऑब्जेक्ट्स दो संग्रहों के बीच एक-दूसरे के बराबर नहीं हैं तो परीक्षणों को विघटित करें। - Louis Wasserman
साथ ही, कृपया ध्यान दें कि, सूचियों के लिए, यह ओ (एन * एम) होगा; अगर आप कॉपी करने के इच्छुक हैं list1 में Set तुलना करने से पहले, आपको ओ (एन) + ओ (एम), यानी, ओ (एन + एम), कुछ अतिरिक्त रैम की कीमत पर मिलेगा; यह गति या स्मृति के बीच चयन करने का मामला है। - Haroldo_OK
वाह! लगता है अब के लिए काम करता है - delive
यह जवाब कोई समझ नहीं आता है। यह कैसे ध्यान में रखता है कि ओपी दो वस्तुओं में एक एकल, विशिष्ट मूल्य की तुलना करना चाहता है? - Zephyr


आप उपयोग कर सकते हैं अपाचे कॉमन्स संग्रह उपयोग करता है:

if(CollectionUtils.containsAny(list1,list2)) {  
    // do whatever you want
} else { 
    // do other thing 
}  

यह मानता है कि आपने अपनी कस्टम ऑब्जेक्ट्स के लिए बराबर कार्यक्षमता को अधिभारित किया है।


31
2017-08-03 13:19



मृत झुकाव, दोस्त। - alexander
यह 4 साल हो गया है और मैं स्पष्ट रूप से पैकेज और फ़ंक्शन को भी बुलाता हूं। - Woot4Moo
एक जेडीके केवल समाधान होने पर अपाचे कॉमन्स के लिए डाउनवोट - ohcibi
@ohcibi जावा में भी लॉगर में बनाया गया है, आपको उन लोगों को डाउनवोट करना चाहिए जो आपके पास लॉग 4j और Log4j2 का उपयोग करने का सुझाव देते हैं। - Woot4Moo
@ Woot4Moo यह निर्भर करता है। ओपीएस समस्या को हल करने के लिए Log4j का उपयोग करने का कोई कारण होने पर डाउनवोट करने का कोई कारण नहीं है। इस मामले में अपाचे कॉमन्स केवल 99% उत्तरों में बेकार ब्लोट होगा जो अपाचे कॉमन्स का सुझाव देता है। - ohcibi


वहाँ है एक विधि का Collection नामित retainAll लेकिन कुछ है दुष्प्रभाव तुम्हारे लिए संदर्भ

इस सूची में केवल तत्वों को बनाए रखता है जो इसमें निहित हैं   निर्दिष्ट संग्रह (वैकल्पिक ऑपरेशन)। दूसरे शब्दों में, हटा देता है   इस सूची से इसके सभी तत्व जो इसमें शामिल नहीं हैं   निर्दिष्ट संग्रह।

यह सही है कि कॉल के परिणामस्वरूप यह सूची बदल गई है

यह पसंद है

boolean b = list1.retainAll(list2);

8
2017-08-03 13:23





Loius जवाब सही है, मैं बस एक उदाहरण जोड़ना चाहता हूँ:

listOne.add("A");
listOne.add("B");
listOne.add("C");

listTwo.add("D");
listTwo.add("E");
listTwo.add("F");      

boolean noElementsInCommon = Collections.disjoint(listOne, listTwo); // true

3
2018-02-19 16:57



मुझे लगता है कि यदि आप दूसरी सूची सूची में तत्व 'ए' जोड़ते हैं तो दो .add ("ए"); भले ही Collections.disjoint (listOne, listTwo); सच आता है। - Sairam Kukadala


तेज तरीके से अतिरिक्त जगह की आवश्यकता होगी।

उदाहरण के लिए:

  1. सभी वस्तुओं को एक सूची में हैशसेट में रखें (आपको object.getAttributeSame ()) का उपयोग करने के लिए अपने द्वारा हैश फ़ंक्शन को लागू करना होगा।

  2. दूसरी सूची के माध्यम से जाएं और जांचें कि कोई आइटम हैशसेट में है या नहीं।

इस तरह प्रत्येक वस्तु का सबसे अधिक बार दौरा किया जाता है। और हैशसेट ओ (1) में किसी ऑब्जेक्ट को चेक या डालने के लिए पर्याप्त तेज़ है।


2
2017-08-03 13:20





के लिए जावाडॉक के अनुसार .contains(Object obj):

यदि इस सूची में निर्दिष्ट तत्व है तो सत्य वापस आता है। अधिक   औपचारिक रूप से, अगर और इस सूची में कम से कम एक है तो केवल सत्य लौटाता है   तत्व ई जैसे कि (ओ == शून्य? ई == शून्य: o.equals (ई))।

तो अगर आप अपना ओवरराइड करते हैं .equals() आपके दिए गए ऑब्जेक्ट के लिए विधि, आपको ऐसा करने में सक्षम होना चाहिए: if(list1.contains(object2))...

यदि तत्व अद्वितीय होंगे (यानी अलग-अलग गुण हैं) तो आप ओवरराइड कर सकते हैं .equals() तथा .hashcode() और सब कुछ स्टोर करें HashSets। यह आपको यह जांचने की अनुमति देगा कि इसमें निरंतर समय में कोई अन्य तत्व है या नहीं।


2
2017-08-03 13:13





इसे तेज बनाने के लिए, आप एक ब्रेक जोड़ सकते हैं; अगर पाया जाता है तो लूप रुक जाएगा यदि सत्य पर सेट किया गया है:

boolean found = false;
for(Object1 object1 : list1){
   for(Object2 object2: list2){
       if(object1.getAttributeSame() == object2.getAttributeSame()){
           found = true;
           //also do something  
           break;
       }
    }
    if(!found){
        //do something
    }
    found = false;
}

यदि आपके पास सूचियों के साथ सूचियों के साथ नक्शे होंगे, तो विशेषताएँ समान है, तो यदि आप दूसरे मानचित्र में कोई संबंधित मान हैं या नहीं, तो आप एक मानचित्र में किसी मान के लिए तेज़ी से जांच सकते हैं।


1
2017-08-03 13:10



हाय टॉम, ध्यान देने के लिए धन्यवाद! हाँ, टाइप करते समय मैं "ब्रेक" भूल गया। लेकिन मैं सोच रहा था कि कुछ एल्गोरिदम है, या मुझे इन सूचियों को किसी अन्य संग्रह में बदलना चाहिए। - Ned
मैंने आपकी टिप्पणी का जवाब देने के लिए एक संपादन किया है - Tom
ओ (एन * एम) से बेहतर कुछ नहीं है? - Woot4Moo
.getAttributeSame ()? - Manish
ऑब्जेक्ट 1 और ऑब्जेक्ट 2 से विधिAttributeSame () प्राप्त करने के लिए कार्यान्वयन प्रदान नहीं किया गया है, लेकिन प्रश्न और उत्तर के लिए भी प्रासंगिक नहीं है; यह सिर्फ एक विशेषता (विशेषता एसएएम, एक लांग) देता है जो दोनों वर्गों में है। - Tom


क्या आप अपने डेटा के प्रकार को परिभाषित कर सकते हैं? क्या यह बड़ा डेटा है? क्या यह क्रमबद्ध है? मुझे लगता है कि आपको डेटा के आधार पर विभिन्न दक्षता दृष्टिकोणों पर विचार करने की आवश्यकता है।

उदाहरण के लिए, यदि आपका डेटा बड़ा और अपरिवर्तित है, तो आप इंडेक्स द्वारा दो सूचियों को एकसाथ कोशिश कर सकते हैं और प्रत्येक सूची विशेषता को प्रत्येक सूची विशेषता में स्टोर कर सकते हैं। तो आप सहायक सूची में वर्तमान विशेषताओं द्वारा चेक पार कर सकते हैं।

सौभाग्य

संपादित: और मैं ओवरलोडिंग बराबर की सिफारिश नहीं करता। इसका खतरनाक और शायद आपके ऑब्जेक्ट ओप अर्थ के खिलाफ।


0
2017-08-03 13:27





org.springframework.util.CollectionUtils

boolean containsAny(java.util.Collection<?> source, java.util.Collection<?> candidates)

Return true if any element in 'candidates' is contained in 'source'; otherwise returns false

0
2018-02-13 07:04