2013-02-22 106 views
5

मुझे एक संग्रह कक्षा की आवश्यकता है जिसमें दोनों हैं: त्वरित अनुक्रमणिका और हैश एक्सेस। अब मेरे पास ArrayList है। इसमें अच्छी इंडेक्स acces है, लेकिन उसकी contains विधि निष्पादक नहीं है। हैशसेट में contains कार्यान्वयन अच्छा है लेकिन कोई अनुक्रमित acces नहीं है। कौन सा संग्रह दोनों में है? शायद अपाचे से कुछ? या मुझे अपनी खुद की संग्रह कक्षा बनाना चाहिए जिसमें दोनों हैं: contains के लिए अनुक्रमित acces और हैशसेट के लिए ArrayList जांचें?इंडेक्स और हैश एक्सेस के साथ संग्रह

बस स्पष्टीकरण के लिए: मैं दोनों get(int index) और contains(Object o)

+2

आपके पास डेटा संरचना है जिसमें दोनों (या उस पर कुछ भिन्नता) शायद जाने का तरीका है। – Dukeling

+0

क्या आप इसे समझा सकते हैं _why_ आप इसे चाहते हैं? –

+0

हाँ मैं कर सकता हूँ। मेरे पास विरासत कोड है, जो सूची वस्तु (ArrayList) के लगभग सभी तरीकों का उपयोग करता है। मुझे इसे फिर से लिखने का कोई मौका नहीं है, लेकिन मैं इसके प्रदर्शन को बढ़ाना चाहता हूं।यहां मुख्य समस्या है और indexOf विधियों में हैं क्योंकि उनके पास रैखिक प्रदर्शन है। –

उत्तर

0

जरूरत है आप शुरू से आखिर तक सूचकांक traversing रहे हैं, तो मुझे लगता है कि यह आपकी आवश्यकताओं को पूरा कर सकता है: आप के माध्यम से बेतरतीब ढंग से उपयोग करने की जरूरत है LinkedHashSet

इंडेक्स, साथ ही हैश एक्सेस, अगर किसी और के पास कोई बेहतर सुझाव नहीं है तो मुझे लगता है कि आप अपना खुद का संग्रह कर सकते हैं जो दोनों करता है।

+2

जहाँ तक मैं देख सकता हूं, अनुक्रमित पहुंच 'ओ (एन)' होगी, जो विशेष रूप से कुशल नहीं है। – Dukeling

+0

लिंक्ड हैशसेट में कोई तरीका नहीं है 'get (int index)' –

+0

@ सर्गीमेडविन्स्की हाँ, लेकिन आप इसे अनुकरण करने के लिए इटरेटर का उपयोग कर सकते हैं। – Dukeling

1

तो अनुक्रमित पहुँच प्रदर्शन एक समस्या करीबी मिलान LinkedHashSet जिसका एपीआई कहना है कि वह

हैश तालिका और सेट इंटरफेस के लिंक्ड सूची कार्यान्वयन है कि, उम्मीद के मुताबिक यात्रा आदेश के साथ नहीं है।

कम से कम मुझे नहीं लगता कि प्रदर्शन LinkedListPerformance की तुलना में खराब होगा। अन्यथा मुझे कोई विकल्प नहीं दिख रहा है लेकिन आपके ऐरेलिस्ट + हैशटेबल समाधान

+0

मुझे यकीन नहीं है कि यह वास्तव में बेहतर है –

0

ऐसा करना; दोनों दुनिया :)

class DataStructure<Integer>{ 
    Hash<Integer,Integer> hash = new HashMap<Integer, Integer>(); 
    List<Integer> list = new ArrayList<Integer>(); 

    public void add(Integer i){ 
     hash.add(i,i); 
     list.add(i); 
    } 
    public Integer get(int index){ 
     return list.get(index); 
    } 
    ... 
} //used Integers to make it simpler 

का सबसे अच्छा पाने के लिए हैश तकनीक के संयोजन के साथ ही सूची का उपयोग तो आपत्ति; आप हैश मैप/हैशसेट के साथ-साथ ArrayList में रखें।

तो तुम बस सुनिश्चित करें कि आप सिंक में दोनों इन संग्रहों कर

contains method : call hashed contains method. 

get an object with index: use array to return the value 

उपयोग करना चाहते हैं। और दोनों डेटा संरचनाओं में अद्यतन/हटाना का ख्याल रखना।

+0

यह आखिरी छेड़छाड़ है, जिसका मैं उपयोग करूंगा, अगर मुझे कुछ बेहतर नहीं मिल रहा है –

0

मुझे सटीक लुकअप के समय नहीं पता, लेकिन शायद आप Map interface के कुछ कार्यान्वयन का उपयोग कर सकते हैं। आप वस्तुओं को map.put(objectHash, obj) के साथ स्टोर कर सकते हैं।

तो फिर तुम सत्यापित कर सकता आप के साथ एक निश्चित वस्तु है:

boolean contained = map.containsValue(obj); 

और आप नक्शे में एक वस्तु देखने के लिए हैश का उपयोग कर सकते हैं:

MyObject object = map.get(objectHash); 

हालांकि, केवल पतन होता कि आपको इस लुकअप कॉल पर अपने हैंश को जानना होगा जो शायद आपके कार्यान्वयन में नहीं हो सकता है।

+0

हैश मैप के लिए वैल्यू एक सूची के रूप में समान प्रदर्शन है - रैखिक। मैं लॉगरिथमिकल (यदि संभव हो तो) की कामना करता हूं। –

+0

@ सर्गीमेडविंस्की आह, मुझे इसके बारे में पता नहीं था। क्या आपके पास इसका संदर्भ है कि आपने इसे कहां पाया? –

+0

बस हैश मैप के कार्यान्वयन को देखें। विधि में सभी प्रविष्टियों पर वैल्यू पुनरावृत्त होता है और समानता के लिए चेक करता है जैसे कि ArrayList की विधि। –