2013-06-03 4 views
6

शुरुआत से पहले, मुझे लगता है कि इस प्रश्न का एक बहुत ही सरल जवाब है कि मैं बस देख रहा हूं। मुझे लगता है कि हाथ पर सवाल पर कुछ और आंखें मेरी समस्या को काफी जल्दी बता सकती हैं।मैं डुप्लिकेट ऑब्जेक्ट्स को दो अलग ArrayLists से कैसे हटा सकता हूं?

मेरे पास दो ArrayLists हैं जिन्हें मैं तुलना करना चाहता हूं और उनमें से प्रत्येक से डुप्लिकेट को हटाना चाहता हूं। पहले ArrayList पुरानी जानकारी के ArrayList है जहां दूसरे ArrayList में नई जानकारी है।

तो

ArrayList<Person> contactList = new ArrayList(); 
contactList.add(new Person("Bob"); 
contactList.add(new Person("Jake"); 
contactList.add(new Person("Joe"); 
ontactList.add(new Person("Rob"); 

ArrayList<Person> updatedContactList = new ArrayList(); 
updatedContactList.add(new Person("Bob"); 
updatedContactList.add(new Person("Jake"); 
updatedContactList.add(new Person("Joe"); 
updatedContactList.add(new Person("Phil"); 

मेरे Person वर्ग बहुत सरल है की तरह, इस उदाहरण

public class Person { 
    private String name; 

    public Person(String a_name) { 
     name = a_name; 
    } 

    public String getName() { 
     return name; 
    } 
} 

के लिए पूरी तरह बनाया तो, ऊपर के उदाहरण का उपयोग करते हुए, मैं उन सभी डुप्लीकेट निकालना चाहते हैं। यदि संभव हो तो मैं इसे केवल दो ArrayLists पर रखने की कोशिश कर रहा हूं, लेकिन अगर मुझे करना है तो मैं ArrayLists में से एक का गहरा क्लोन करने के लिए तैयार हूं।

तो मैं जिसके परिणामस्वरूप ArrayList एक बार तुलना

यहाँ किया जाता है उस में निम्न जानकारी शामिल करनी है कोड मैं एक साथ रख दिया

for(int i = 0; i < contactList.size(); i++) { 
    for(int j = 0; j < updatedContactList.size(); j++) { 

     if(contactList.get(i).getName().equals(updatedContactList.get(j).getName())) { 
      //removed friends      
      contactList.remove(contactList.get(i)); 

      //new friends ---- only one at a time works 
      //updatedContactList.remove(updatedContactList.get(j)); 
     } 
    } 
} 

मैं केवल सक्षम हूँ चाहते हैं उपरोक्त लूप में ArrayLists में से किसी एक व्यक्ति को निकालने के लिए अन्यथा मुझे गलत परिणाम मिलते हैं।

तो मेरा सवाल यह है कि, क्या ऐरेलिस्टिस्टों के डुप्लिकेट तत्वों को हटाने का कोई आसान तरीका है? यदि हां, तो मैं इसके बारे में कैसे जा सकता हूं।

मुझे एहसास है कि मैं शायद ArrayList अद्यतन गहरा क्लोन कर सकता हूं और केवल उस वस्तु को हटा सकता हूं, लेकिन मुझे आश्चर्य है कि इसे क्लोन किए बिना कोई रास्ता है या नहीं।

मुझे यह भी एहसास है कि मैं बस सभी तत्वों को एक सेट में रख सकता हूं और यह डुप्लिकेट को हटा देगा, लेकिन मैं 'हटाया' और 'नया' व्यक्ति वस्तुओं को अलग रखना चाहता हूं।

+0

मुझे लगता है कि अलग-अलग सूचियों में डुप्लिकेट नहीं होंगे, सही? – arshajii

+0

@arshajii एक बार तुलना की जाने के बाद, प्रत्येक सूची में उनमें से दोनों के बीच कोई डुप्लीकेट नहीं होना चाहिए। एक ऐरेलिस्ट में 'व्यक्ति' को हटा दिया जाएगा और अन्य ऐरेलिस्ट में केवल नई 'व्यक्ति' वस्तुएं होंगी। – WilliamShatner

+0

मेरा मतलब है कि पहले से ही, दो सूचियों में कुछ भी किया जाता है। उदाहरण के लिए, आप 'संपर्क सूची' में दो 'बॉब' नहीं कर सकते हैं, है ना? – arshajii

उत्तर

6

क्या तुम सच में है सूचियों सेट नहीं है, लेकिन Set के रूप में। उचित संचालन सुनिश्चित करने के लिए Person कक्षा के लिए equals और hashCode को भी कार्यान्वित करें।

एक बार जब आप गए हैं, आपको सेट अंतर की गणना करने के लिए (जो कि तुम क्या जरूरत है) एक-लाइनर्स लिखने के लिए सक्षम हो जाएगा: लेकिन यह

final Set<Person> contactsBackup = new HashSet<>(contacts); 
contacts.removeAll(updatedContacts); 
updatedContacts.removeAll(contactsBackup); 

ध्यान दें कि यह एक और प्रतिलिपि बनाने शामिल है, एक गहरी प्रति नहीं है — केवल संदर्भों की प्रतिलिपि बनाई गई है। यह एक बहुत हल्का ऑपरेशन है और आपको इसके प्रभाव के बारे में चिंता नहीं करनी चाहिए।

, तो मुझे बिल्कुल स्पष्ट है, तो आप वास्तव में सूचियों की जरूरत नहीं किसी कारण से, एक ही कोड उनके लिए भी काम करेंगे (List भी removeAll को परिभाषित करता है), लेकिन आप O (n साथ रहने के लिए होगा) जटिलता इस ऑपरेशन सूचियों के लिए लागू है।

+0

+1। 'List # removeAll (संग्रह) 'का रनटाइम वास्तव में पैरामीटर के रूप में पारित संग्रह के प्रकार पर निर्भर करता है। आपका कथन 'list.removeAll (अन्य सूची) के लिए सच है; '। निम्नलिखित 'ओ (एन) ':' सूची होगी।हटाएंअसल (हैशसेट); ' – jlordo

+0

@ मार्कोटोपोलनिक यह ऐसा करने का एक अच्छा आसान तरीका है (जैसा कि जेएलओआरओ की विधि करता है), लेकिन अगर मेरी सूचियों को हल करना है तो क्या होगा? उदाहरण के लिए, जब मैं उन्हें एक्सएमएल से बाहर निकालता हूं तो वे वर्णानुक्रम में आते हैं। लेकिन अगर मैं बाद में फैसला करता हूं कि मैं उन्हें कुछ अलग-अलग जानकारी से क्रमबद्ध करना चाहता हूं, तो क्या यह एक सेट होने के बाद एक समस्या होगी? – WilliamShatner

+0

@jlordo ठीक है, मैंने आपके बयान का बिल्कुल विरोध नहीं किया है :) लेकिन मैंने अपनी टिप्पणी में एक त्रुटि पकड़ी, इसलिए मैंने इसे हटा दिया। मैं कोड verbatim नहीं रख सका। –

2

Set और addAll दोनों ArrayLists दोनों से बनाएँ।

Set<Person> set = new ArrayList<Person>(); 

http://docs.oracle.com/javase/6/docs/api/java/util/Set.html

+1

इसके साथ समस्या यह है कि वे संयुक्त हो जाएंगे। मेरे प्रश्न के अंत में, मैंने (खराब) ने कहा कि मैं उन्हें अलग कंटेनर में रखना चाहता हूं। – WilliamShatner

3

अवहेलना equals() और अपने Person कक्षा में hashCode() और बस कार्य करें: मॉडल दोनों पुराने और नए संपर्कों:

Set<Person> temp = new HashSet<>(contactList); 
contactList.removeAll(updatedContactList); 
updatedContactList.removeAll(temp); 
temp.clear(); // not necessary if this code is in a method 
+1

क्या आप थोड़ा सा विस्तार कर सकते हैं? मैं मानता हूं कि 'बराबर()' मैं जो करता हूं वह करता हूं (अगर मैं गलत हूं तो मुझे सही करें)। मैंने पहले कभी हैशकोड() 'ओवरराइड नहीं किया है। मैं अपने ओवरराइड 'हैशकोड() 'विधि में क्या करूँगा? – WilliamShatner

+1

क्या आप ग्रहण का उपयोग कर रहे हैं? यदि ऐसा है, तो 'स्रोत -> हैशकोड जेनरेट करें() और बराबर() ' – jlordo

+0

नेटबीन्स 7.1 (जेडीके अभी भी 6 पर है) – WilliamShatner

1

इस मामले में सेट और नहीं सूची का उपयोग करें (यदि संभव हो तो इसका उपयोग डीबी से डेटा प्राप्त हो रहा है) यदि संभव हो तो। फिर आप व्यक्तिगत वर्ग में बराबर और हैशकोड विधि को ओवरराइड कर सकते हैं ताकि आवश्यक तुलना जोड़ने के दौरान किया जा सके और डुप्लिकेट निकाला जा सके। लिंक्ड हैशसेट का उपयोग किया जा सकता है क्योंकि सूची में धीमा हो सकता है क्योंकि इसमें डेटा बढ़ता है।

0

यह एक एक पंक्ति जावा 8 क्षमताओं

public static final <T> void removeCommonEntries(Collection<T> a, Collection<T> b){ 
     b.removeIf(i -> a.remove(i)); 
} 

मैं अपने कस्टम CollectionUtils में इस समाधान डाल के सुरुचिपूर्ण समाधान बनाने इस्तेमाल होता है।

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