2010-02-10 15 views
33

मैं एक पाठ फ़ाइल से डेटा पढ़ने में अद्वितीय स्ट्रिंग्स की एक सूची सहेजें, इसलिए हो सकता है:ArrayList

 
John 
Mary 
John 
Leeds 

मैं अब, ArrayList में 3 अद्वितीय तत्व प्राप्त करने की आवश्यकता वहाँ केवल हैं, क्योंकि 3 अद्वितीय फ़ाइल आउटपुट में मूल्य (ऊपर के रूप में)।

मैं एक हैशटेबल का उपयोग कर सकता हूं और इसमें जानकारी जोड़ सकता हूं, फिर बस अपने डेटा को सूची में कॉपी कर सकता हूं। क्या अन्य समाधान हैं?

उत्तर

73

आपको इसे List में स्टोर करने की आवश्यकता क्यों है? क्या आपको वास्तव में डेटा का ऑर्डर करने या इंडेक्स-आधारित लुक-अप का समर्थन करने की आवश्यकता है?

मैं Set में डेटा संग्रहीत करने का सुझाव दूंगा। अगर ऑर्डरिंग महत्वहीन है तो आपको HashSet का उपयोग करना चाहिए। हालांकि, अगर आप ऑर्डरिंग को सुरक्षित रखना चाहते हैं तो आप LinkedHashSet का उपयोग कर सकते हैं।

+1

क्यों? कारण सूची का उपयोग अक्सर किया जाता है और इसके साथ काम करना आसान होता है। मुझे लगता है कि यदि आप अन्य डेवलपर्स के लिए कोड लिखते हैं तो किसी अन्य प्रकार की तुलना में सूची प्रकार वापस करना बेहतर होता है। – EugeneP

+0

जरूरी नहीं है। एकमात्र मामला जहां आपको एक सूची की आवश्यकता होगी, यदि आप संग्रह में वस्तुओं को यादृच्छिक अनुक्रमित पहुंच चाहते हैं। अन्यथा यह सादा हैशसेट या लिंक्ड हैशसेट के साथ जाने के लिए प्राथमिक होगा। –

+0

मेरी राय में जब आप इंडिस का उपयोग करते हैं तो कोड क्लीनर होता है। डेटा संरचना के अंदर आपके पास "आप कहां हैं" पर नियंत्रण है। यह सी भाषा के साथ अपने अनुभव से आ सकता है। – EugeneP

16

आप जोड़ने से पहले list.contains() देख सकते हैं।

if(!list.contains(value)) { 
    list.add(value); 
} 

मुझे लगा कि यह स्पष्ट होगा! हालांकि, हैशसेट में आइटम जोड़ना और फिर इस सेट से एक सूची बनाना अधिक कुशल होगा।

+0

मुझे लगता है कि यह "बराबर" विधि का उपयोग करता है? – EugeneP

+0

हां यह आंतरिक रूप से स्ट्रिंग पर बराबर() का उपयोग करता है। –

+0

हां। धन्यवाद। मेरे मामले में यह बेहतर होगा, 'क्योंकि कोड साफ रखा जाएगा। लेकिन मुझे लगता है कि हैशटेबल एल्गोरिदम विधि से अधिक तेज़ है, जब तक कि वे आंतरिक रूप से हैशटेबल का उपयोग न करें। – EugeneP

4

किसी सूची के बजाय set का उपयोग करें। यहां एक नज़र डालें: Java Collections Tutorials और विशेष रूप से यहां सेट्स के बारे में: Java Sets Tutorial

संक्षेप में, सेट में से कुछ में से एक होता है। बिल्कुल सही :)

61

आप एक List युक्त डुप्लिकेट है, और आप के बिना एक List चाहते हैं, आप कर सकता है:

List<String> newList = new ArrayList<String>(new HashSet<String>(oldList)); 

है, डुप्लिकेट को निकालने के एक सेट में पुरानी सूची लपेट और है कि सेट लपेट एक सूची में फिर से।

+0

मुझे लगता है, इस बात की कोई गारंटी नहीं है कि 'न्यूलिस्ट' का क्रम 'पुरानी सूची' में से एक जैसा होगा, या? – Marvin

+7

ओ.के. मुझे मेरी टिप्पणी का जवाब मिला: यदि आप 'हैशसेट' के बजाय 'लिंक्ड हैशसेट' का उपयोग करते हैं, तो आप ऑर्डर को सुरक्षित रखते हैं। – Marvin

1

यहाँ कैसे मैं इसे हल है:

import groovy.io.*; 
def arr = ["5", "5", "7", "6", "7", "8", "0"] 
List<String> uniqueList = new ArrayList<String>(new HashSet<String>(arr.asList())); 
System.out.println(uniqueList) 
0
class HashSetList<T extends Object> 
    extends ArrayList<T> { 

    private HashSet<Integer> _this = new HashSet<>(); 

    @Override 
    public boolean add(T obj) { 
     if (_this.add(obj.hashCode())) { 
      super.add(obj); 
      return true; 
     } 
     return false; 
    } 
} 

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

+0

अच्छा विचार, लेकिन ... हटाने और जोड़ने (int, *) आदि के बारे में क्या? यह समाधान पूरा नहीं हुआ है। –