2010-11-22 10 views
19

मैं java.util पैकेज में डेटा संरचना की तलाश में हूं। मुझे निम्नलिखित आवश्यकताओं को पूरा करने की आवश्यकता है:क्या Java.util पैकेज में कोई अनुक्रमित क्रमबद्ध सूची है?

  • तत्वों की संख्या (सैद्धांतिक रूप से) असंबद्ध है।
  • तत्व आरोही क्रम में क्रमबद्ध हैं।
  • आप एनएच तत्व (तेज़) प्राप्त कर सकते हैं।
  • आप एनएच तत्व (तेज़) को हटा सकते हैं।

मुझे एक अनुक्रमणीय छोड़ने की सूची खोजने की उम्मीद है, लेकिन मैंने नहीं किया। क्या उनके पास कोई डेटा संरचना है जो मैंने बताई गई आवश्यकताओं को पूरा करती है?

+1

टैग अनॉर्डर्ड-सूची क्यों? –

+0

@ माइकल: धन्यवाद। मेरा मतलब आदेश-सूची थी। सही किया। – snakile

उत्तर

3

कोई साधारण डेटा संरचना मौजूद नहीं है जो आपके सभी मानदंडों को पूरा करती है।

केवल एक जिसे मैं जानता हूं जो उन्हें पूरा करता है, वह indexable skip list होगा। हालांकि, मुझे किसी भी आसानी से उपलब्ध जावा कार्यान्वयन के बारे में पता नहीं है।

+0

एक और डेटा संरचना एक सूचकांक खोज पेड़ है। एक साधारण उदाहरण एक बाइनरी सर्च ट्री है जो प्रत्येक नोड पर उपट्री के उस आकार को भी स्टोर करता है। – Travis

-1

PriorityQueue पर देखें।

यदि आपको अपनी डेटा संरचना में समान तत्वों की आवश्यकता नहीं है, तो सामान्य ट्रीसेट भी आपकी आवश्यकताओं को फिट करता है।

+3

मैं प्राथमिकता कतार में एनएच तत्व प्राप्त नहीं कर सकता/निकाल सकता हूं। केवल पहला तत्व – snakile

1

TreeSet आपको सूची में तत्व जोड़ने के दौरान प्राकृतिक सॉर्टिंग की कार्यक्षमता प्रदान करता है। लेकिन अगर आपको इसकी आवश्यकता नहीं है और Collections.sort() की अनुमति है तो आप सरल ArrayList का उपयोग कर सकते हैं।

+2

ऐरेलिस्ट - तत्वों का आदेश नहीं दिया जाता है। ट्रीसेट - एनएच तत्व प्राप्त नहीं कर सकता/हटा सकता है (यदि मेरे पास कोई कुंजी है तो केवल तत्व प्राप्त/हटा सकता है) – snakile

+0

हां, मुझे पता है, लेकिन इसे सॉर्ट किया जा सकता है, उदाहरण के लिए, संग्रह कुछ पल तक पूर्ण हो गया है और नहीं अब और अपडेट किया गया। –

2

यह सवाल बहुत

के समान है my answer to that question पर एक नज़र डालें।

class SortedArrayList<T> extends ArrayList<T> { 

    @SuppressWarnings("unchecked") 
    public void insertSorted(T value) { 
     add(value); 
     Comparable<T> cmp = (Comparable<T>) value; 
     for (int i = size()-1; i > 0 && cmp.compareTo(get(i-1)) < 0; i--) { 
      T tmp = get(i); 
      set(i, get(i-1)); 
      set(i-1, tmp); 
     } 
    } 
} 

अपनी पहली आवश्यकता पर एक नोट:: "तत्वों की संख्या असीमित है।":

मूल रूप से यह पता चलता है निम्नलिखित

आप को यह प्रतिबंधित करने के लिए चाहते हो सकता है कुछ "तत्वों की संख्या 2 -1 से कम नहीं होनी चाहिए ..." अन्यथा आप जावा सरणी द्वारा समर्थित सभी विकल्पों को रद्द कर रहे हैं। (आप उदाहरण के लिए एक LinkedList का उपयोग कर तत्वों की एक मनमाना संख्या के साथ भाग मिल सकता है, लेकिन मैं कैसे आपको लगता है कि में तेजी से लुकअप कर सकता है नहीं देख सकता।)

+3

एक विशिष्ट संग्रह कार्यान्वयन विस्तार करना शायद ही कभी एक अच्छा विचार है। विशेष रूप से जब आप एक नया अनुबंध लागू करने का प्रयास करते हैं (जोड़ विधि आपके मामले में सॉर्ट तोड़ सकती हैं)। * गुण * कक्षा के अच्छे उदाहरण के लिए 'गुण' कक्षा को देखें! – barjak

+0

एक ऐरेलिस्ट से हटाना एक ओ (एन) ऑपरेशन है। मेरे पास कोई बेहतर विचार नहीं है, लेकिन सोचा कि इसे इंगित किया जाना चाहिए। – user506069

+0

@barjak, यह एक अच्छा मुद्दा है। उदाहरण के लिए कोई इन विधियों को ओवरराइड कर सकता है और केवल एक असमर्थितऑपरेशन अपवाद फेंक सकता है। फिर भी, मैं नहीं देख सकता कि इस वजह से सूची इंटरफ़ेस को स्क्रैच से कार्यान्वित करना बेहतर क्यों होगा ... – aioobe

0

पर विचार करें ListCollections.sort() के साथ संयुक्त।

+1

सूची सिर्फ एक इंटरफेस है, एक कार्यान्वयन का प्रस्ताव है। –

0

क्या dwb List<T> और Collections.sort() साथ कहा गया है के साथ जा रहे हैं, तो आप ArrayList<T> उपयोग कर सकते हैं कि के रूप में लागू करता List<T> (और Vector<T> तरह संबद्ध नहीं है जब तक कि बेशक आप उस भूमि के ऊपर चाहते हैं)। यह शायद आपकी सबसे अच्छी शर्त है क्योंकि वे (सूर्य) आम तौर पर इन क्षेत्रों में बहुत से शोध करते हैं (जो मैंने देखा है)। यदि आपको "डिफ़ॉल्ट" के अलावा किसी अन्य चीज़ को सॉर्ट करने की आवश्यकता है (यानी आप पूर्णांक की सूची को सॉर्ट नहीं कर रहे हैं), तो अपने स्वयं के तुलनित्र की आपूर्ति करें।

संपादित करें: एक ही चीज़ को पूरा नहीं करता है कि अपनी आवश्यकताओं को तेजी से हटाया जाना है ...

5

जावा मानक पुस्तकालयों में ऐसी कोई कंटेनर है।

जब मैं इन गुणों के साथ एक डेटा संरचना की जरूरत है, मैं एक List कार्यान्वयन का उपयोग (आम तौर पर एक ArrayList है, लेकिन यह कोई फर्क नहीं पड़ता है), और मैं सभी Collections.binarySearch का उपयोग कर सम्मिलन है।

अगर मुझे एक पुन: प्रयोज्य वर्ग के रूप में एक क्रमबद्ध सूची को समाहित करना पड़ा, तो मैं सूची इंटरफ़ेस को कार्यान्वित करता हूं, जो सभी विधियों को 'मानक' सूची कार्यान्वयन में प्रस्तुत करता है (इसे कन्स्ट्रक्टर को पैरामीटर के रूप में भी पारित किया जा सकता है)। मैं अपवाद (UnsupportedOperationException) फेंक कर प्रत्येक सम्मिलन विधि (जोड़ें, addAll, set, Iterator's remove) लागू करता हूं, ताकि कोई भी 'हमेशा क्रमबद्ध' संपत्ति को तोड़ सके। अंत में, मैं एक विधि insertSorted प्रदान करता हूं जो सम्मिलन करने के लिए Collections.binarySearch का उपयोग करेगा।

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