2013-09-25 13 views
8

मैं जावा के लिए नौसिखिया हूं। मेरे पास ArrayList है और मैं सम्मिलन पर डुप्लीकेट से बचना चाहता हूं। मेरे ArrayListजावा: सरणीसूची में डुप्लिकेट डालने से बचें

ArrayList<kar> karList = new ArrayList<kar>(); 

है और क्षेत्र मैं जाँच करना चाहते है:

kar.getinsertkar(). 

मैंने पढ़ा है कि मैं HashSet या HashMap उपयोग कर सकते हैं, लेकिन मैं कोई सुराग नहीं है।

+3

"के बारे में अधिक पढ़ सकते हैं" लेकिन मुझे कोई संकेत नहीं है "आपका क्या मतलब है? जैसा कि आपने पढ़ा है, उसी तरह 'हैशसेट' का उपयोग करें। –

+0

[सुराग] (http://docs.oracle.com/javase/tutorial/collections/interfaces/set.html) – ajb

+0

ध्यान दें कि ऐसा कोई नियम नहीं है जो कहता है कि आपके पास * दोनों * एक 'ऐरेलिस्ट' नहीं हो सकता है और ' हैशसेट 'एक ही तत्व के साथ। आप तत्वों को अपने इच्छित क्रम में रखने के लिए 'ऐरेलिस्ट' का उपयोग कर सकते हैं, और यह जांचने के लिए 'हैशसेट' कि कोई तत्व पहले से मौजूद है या नहीं। (चेक 'ऐरेलिस्ट' की खोज करने से तेज़ होगा, लेकिन दो संग्रह बनाए रखने से चीज़ें धीमी हो जाएंगी।) कभी-कभी चीजों को करने का यह सही तरीका है। – ajb

उत्तर

4

ArrayList के बजाय HashSet का उपयोग करें। लेकिन, वास्तव में HashSet वास्तव में अच्छी तरह से काम करने के लिए, आपको HashSet में डाले गए वर्ग/ऑब्जेक्ट्स के equals() और hashCode() विधियों को ओवरराइड करना होगा।

फ़ो उदाहरण:

Set<MyObject> set = new HashSet<MyObject>(); 
set.add(foo); 
set.add(bar); 

public class MyObject { 
    @Override 
    public boolean equals(Object obj) { 
     if (obj instanceof MyObject) 
      return (this.id = obj.id) 
     else 
      return false; 
    } 
    // now override hashCode() 
} 

कृपया hashCode() और equals() अधिभावी के लिए निम्नलिखित documentation देखते हैं।

+0

मैंने अपनी कक्षा में अन्य विधियों के लिए सरणीसूची का उपयोग किया, मैं इसे कैसे बदल सकता हूं? – user2766131

+0

+1 अच्छा सुझाव है, और हम यह इंगित कर सकते हैं कि सेट में जाने वाली वस्तुओं में उचित बराबर होना चाहिए() और हैशकोड() विधि लागू की गई है। – vikingsteve

+0

हैशसेट में उपयोग की जाने वाली विधियां एक ऐरेलिस्ट के समान होनी चाहिए क्योंकि वे दोनों एक ही इंटरफ़ेस को लागू करते हैं। – blackpanther

20

जब भी आप डुप्लिकेट को रोकना चाहते हैं, तो आप Set का उपयोग करना चाहते हैं।

इस मामले में, हैशसेट आपके लिए ठीक होगा।

HashSet karSet = new HashSet(); 
karSet.add(foo); 
karSet.add(bar); 
karSet.add(foo); 
System.out.println(karSet.size()); 
//Output is 2 

पूर्णता के लिए, मैं भी आप वर्ग के सामान्य (पैरामिट्रीकृत) संस्करण का उपयोग, जावा 5 या अधिक मानते हुए सुझाव है।

HashSet<String> stringSet = new HashSet<String>(); 
HashSet<Integer> intSet = new HashSet<Integer>(); 
...etc... 

यह आपको किसी प्रकार की सुरक्षा में और अपने सेट से बाहर आइटम प्राप्त करने के लिए भी मिल जाएगी।

+4

और कृपया पैरामीटरयुक्त प्रकार का उपयोग करें ... – vikingsteve

+4

आमतौर पर हम वर्र्स प्रकार के लिए इंटरफ़ेस का उपयोग करते हैं: ' स्ट्रिंगसेट = नया हैशसेट (); कार्यान्वयन नहीं –

4

एक सेट बस एक संग्रह है कि कोई डुप्लिकेट तो यह आप के लिए एकदम सही लग रहा है को शामिल कर सकते हैं।

यह लागू करने के लिए भी बहुत आसान है। उदाहरण के लिए:

Set<String> mySet = new HashSet<String>(); 

यह आपको एक सेट प्रदान करेगा जो प्रकार के स्ट्रिंग ऑब्जेक्ट्स को पकड़ सकता है।

सेट करने के लिए जोड़ने के लिए बस के रूप में सरल है:

mySet.add("My first entry!"); 

एक सेट की परिभाषा के अनुसार, आप जो कुछ भी आप चाहते हैं जोड़ सकते हैं और एक नकली में चलाने कभी नहीं।

मज़े करो!

संपादित करें: यदि आप तय करते हैं कि आप एक ऐरेलिस्ट का उपयोग करने पर मृत सेट हैं, तो यह देखना आसान है कि कोई वस्तु पहले से ही सूची में शामिल है या नहीं।

public void addToList(String newEntry){ 
    if(!myList.contains(newEntry)) 
     myList.add(newEntry); 
} 

नोट: उदाहरण के लिए: मेरे सभी उदाहरण आप स्ट्रिंग वस्तुओं का उपयोग कर रहे मान, लेकिन वे आसानी से किसी भी अन्य ऑब्जेक्ट प्रकार को लगा दिया जा सकता है।

0

आपको Set कार्यान्वयन का उपयोग करने की आवश्यकता है, उदाहरण के लिए आप HashSet का उपयोग कर सकते हैं। आप अपने HashSet में add कस्टम वस्तु kar करना चाहते हैं, तो आप overrideequals और hashcode विधि की जरूरत है। आप equals और hashcode, see

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