2010-10-13 15 views
6

मैं विस्तार LinkedList की स्थिति में हूँ और सेट को लागू है, ताकि मुझे कोई डुप्लिकेट के साथ एक सूची है। मैं सोच रहा हूं कि ऐसा कार्यान्वयन पहले से मौजूद नहीं है?सूची कार्यान्वयन जो सेट एक सूची (अनुक्रम) दोनों है?

मैं जो करने की योजना बना रहा हूं वह पहले तत्व को देखने के लिए add(e) विधि को ओवरराइड करना है, और यदि वर्तमान में इसे जोड़ना नहीं है। की तरह कुछ:

add(E){ 
    if(get(E) == null) super.add(E); 
} 

उत्तर

5

कोई जावा कार्यान्वयन मानक संग्रह में मौजूद है।

हालांकि, आप पर पर एक नज़र डाल सकते हैं जो आप देख रहे हैं कि आप क्या देख रहे हैं।

+0

यह वही है जो मैं ढूंढ रहा था। एक ही समय में पुन: उपयोग और सादगी लेना, क्या आप मेरी कक्षा बनाने, या इस पुस्तकालय को मैवेन से आयात करने की सलाह देंगे? इसके अलावा, यह एक मानक सूची कार्यान्वयन से क्यों नहीं है? – simpatico

+2

मैं इस लाइब्रेरी को आयात करूंगा, जब तक कि आप इसे स्वयं को फिर से बनाने की आवश्यकता महसूस न करें, वह विकल्प तुम्हारा है। –

+0

@ सिंपेटिको: यदि आप इसे उपयोगी पाते हैं तो आप @ एंथनी के जवाब को ऊपर उठा सकते हैं। :)। चीयर्स! – ivorykoder

6

शायद LinkedHashSet आप क्या चाहते हैं नहीं करता है। यह प्रविष्टि क्रम में (डिफ़ॉल्ट रूप से) तत्वों को रखता है।

यह एक ही समय (कम से कम अगर आप सूची और सेट के लिए विनिर्देशों का पालन करना चाहते हैं) में दोनों इंटरफेस को लागू करने की वजह से hashCode परिभाषाओं संघर्ष संभव नहीं है।

इस सूची के लिए हैश कोड मान देता है। एक सूची के हैश कोड निम्नलिखित गणना का परिणाम माना परिभाषित किया गया है:

hashCode = 1; 
    Iterator i = list.iterator(); 
    while (i.hasNext()) { 
     Object obj = i.next(); 
     hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode()); 
    } 

बनाम

इस सेट के लिए हैश कोड मान देता है। एक सेट के हैश कोड सेट, जहां एक अशक्त तत्व की hashCode शून्य होने के लिए परिभाषित किया गया है में तत्वों की हैश कोड का योग होने के लिए परिभाषित किया गया है। यह सुनिश्चित करता है कि s1.equals (s2) का तात्पर्य है कि s1.hashCode() == किसी भी दो सेट एस 1 और एस 2, के रूप में Object.hashCode विधि के सामान्य अनुबंध के लिए आवश्यक के लिए s2.hashCode()।

+1

LinkedHashSet एक सच्ची सूची की तरह व्यवहार नहीं करता है क्योंकि आप स्थितिगत रूप से प्राप्त, सम्मिलित, अद्यतन या हटा नहीं सकते हैं। और आप एक समरूप सूचीपत्र वर्ग में 'बराबर' और 'हैशकोड' लागू कर सकते हैं ताकि वे पूरी तरह रिलीज़ इंटरफ़ेस/सुपरक्लास अनुबंधों का पालन न करें। –

+0

हाँ, यही कारण है कि मैंने कहा "शायद"। – Thilo

+0

यह वही है जो मैं उपयोग कर रहा हूं। हालांकि, मैंने अभी देखा है कि उन्हें डीपी से जेपीए 2 के साथ पुनर्प्राप्त करते समय उन्हें आदेश नहीं दिया जाता है। ऐसा इसलिए है क्योंकि मेरे पास सेट के रूप में घोषणा थी। मैं इसके बारे में एक और सवाल पोस्ट करूंगा। – simpatico

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