Java में SortedList क्यों नहीं है?


502

जावा में SortedSetऔर SortedMapइंटरफेस हैं। दोनों जावा कलेक्शंस फ्रेमवर्क से संबंधित हैं और तत्वों को एक्सेस करने के लिए एक हल किया हुआ तरीका प्रदान करते हैं।

हालांकि, मेरी समझ SortedListमें जावा में कोई नहीं है। आप java.util.Collections.sort()एक सूची को सॉर्ट करने के लिए उपयोग कर सकते हैं ।

किसी भी विचार क्यों यह उस तरह बनाया गया है?



6
इसलिए सूची के बीच में एक तत्व डालने पर आपका अपेक्षित परिणाम क्या है?
बेस्ट

4
@bestsss यह पूरी तरह से एक SortedList वर्ग के लिए संभव होगा जो java.util.List इंटरफ़ेस को लागू नहीं करता है। एक जांच के रूप में प्रश्न पढ़ें कि कोई डेटा संरचना क्यों नहीं है जो अनुरोधित कार्यक्षमता का समर्थन करती है। नामकरण जैसे महत्वहीन विवरणों से विचलित न हों।
वृद्धनाथ

@ वृद्ध, इसके लिए सामान्य संरचना एक पेड़ है (लाल / काला, avl या btree) w / अतिरिक्त प्रबल / अगले क्रम में समर्थन के लिए लिंक। मैं समान संरचना का उपयोग करता हूं लाल / काला w / प्रचलित / अगले लिंक। यह एक बहुत आला उपयोग है, यद्यपि। पेड़ को आदेश दिया और डालने के आदेश दोनों का पता लगाया जा सकता है, O (logn) को ढूंढना / समाहित करना है लेकिन प्राप्त करना (int) O (n) है। इस तथ्य को देखते हुए कि मुझे लगता है कि डेवलपर्स को इसे लागू करने के लिए छोड़ दिया गया था, अगर उन्हें जरूरत है।
बेस्ट

3
प्रश्न का उत्तर "क्यों" नहीं है, लेकिन ट्रीसेट के लिए सबसे सरल वर्कअराउंड कंपैरिलेटर का उपयोग करना है जो कभी भी शून्य नहीं लौटाता है, जैसे int diff = this.score - that.score; return (diff == 0) ? 1 : diff; कि यह एक बदबूदार हैक है मैं इसे किसी भी कार्यान्वयन को तुलना करने के बजाय एक अनाम निर्माता तर्क के रूप में प्रदान करेगा।
इयरकैम

जवाबों:


682

सूची पुनरावृत्तियों की गारंटी सबसे पहले और सबसे महत्वपूर्ण है कि आपको सूची के आंतरिक क्रम में सूची के तत्व मिलते हैं (उर्फ प्रविष्टि आदेश )। अधिक विशेष रूप से यह उस क्रम में है जिसे आपने तत्वों को सम्मिलित किया है या आपने सूची में हेरफेर कैसे किया है। सॉर्टिंग को डेटा संरचना के हेरफेर के रूप में देखा जा सकता है, और सूची को सॉर्ट करने के कई तरीके हैं।

मैं उपयोगिता के क्रम में तरीके बताता हूँ जैसा कि मैं व्यक्तिगत रूप से देखता हूँ:

1. इसके बजाय उपयोग Setया Bagसंग्रह पर विचार करें

नोट: मैंने इस विकल्प को शीर्ष पर रखा है क्योंकि यह वही है जो आप सामान्य रूप से वैसे भी करना चाहते हैं।

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

इसके अलावा यदि आप सुनिश्चित हैं कि आपको डुप्लिकेट तत्वों के बारे में चिंता करने की ज़रूरत नहीं है (या है) तो आप TreeSet<T>इसके बजाय उपयोग कर सकते हैं । यह लागू करता है SortedSetऔर NavigableSetइंटरफेस और काम करता है जैसा कि आप शायद एक सूची से उम्मीद करेंगे:

TreeSet<String> set = new TreeSet<String>();
set.add("lol");
set.add("cat");
// automatically sorts natural order when adding

for (String s : set) {
    System.out.println(s);
}
// Prints out "cat" and "lol"

यदि आप प्राकृतिक ऑर्डर नहीं करना चाहते हैं तो आप कंस्ट्रक्टर पैरामीटर का उपयोग कर सकते हैं जो कि लेता है Comparator<T>

वैकल्पिक रूप से, आप मल्टीसेट्स (जिसे बैग्स के रूप में भी जाना जाता है ) का उपयोग कर सकते हैं , यह एक Setऐसा है जो डुप्लिकेट तत्वों की अनुमति देता है, इसके बजाय तीसरे पक्ष के कार्यान्वयन हैं। सबसे विशेष रूप से अमरूद पुस्तकालयों में से एक है TreeMultiset, जो बहुत कुछ काम करता है TreeSet

2. अपनी सूची के साथ क्रमबद्ध करें Collections.sort()

जैसा कि ऊपर उल्लेख किया गया है, एस की छंटनी Listडेटा संरचना का एक हेरफेर है। तो ऐसी स्थितियों के लिए जहां आपको "सत्य के एक स्रोत" की आवश्यकता होती है, जिसे विभिन्न तरीकों से क्रमबद्ध किया जाएगा फिर इसे मैन्युअल रूप से सॉर्ट करना है।

आप java.util.Collections.sort()विधि के साथ अपनी सूची को सॉर्ट कर सकते हैं । यहाँ कैसे पर एक कोड नमूना है:

List<String> strings = new ArrayList<String>()
strings.add("lol");
strings.add("cat");

Collections.sort(strings);
for (String s : strings) {
    System.out.println(s);
}
// Prints out "cat" and "lol"

तुलना का उपयोग करना

एक स्पष्ट लाभ यह है कि आप विधि Comparatorमें उपयोग कर सकते हैं sort। जावा इस Comparatorतरह के लिए कुछ कार्यान्वयन प्रदान करता है Collatorजो स्थानीय संवेदनशील छंटाई के लिए उपयोगी है। यहाँ एक उदाहरण है:

Collator usCollator = Collator.getInstance(Locale.US);
usCollator.setStrength(Collator.PRIMARY); // ignores casing

Collections.sort(strings, usCollator);

समवर्ती वातावरण में छंटनी

ध्यान दें कि sortविधि का उपयोग करना समवर्ती वातावरण में अनुकूल नहीं है, क्योंकि संग्रह आवृत्ति में हेरफेर किया जाएगा, और आपको इसके बजाय अपरिवर्तनीय संग्रह का उपयोग करने पर विचार करना चाहिए। यह कुछ अमरूद है जो Orderingकक्षा में प्रदान करता है और एक साधारण लाइनर है:

List<string> sorted = Ordering.natural().sortedCopy(strings);

3. के साथ अपनी सूची लपेटें java.util.PriorityQueue

हालाँकि, जावा में कोई क्रमबद्ध सूची नहीं है, फिर भी एक क्रमबद्ध कतार है जो शायद आपके लिए भी काम करेगी। यह java.util.PriorityQueueवर्ग है।

नीको हासे टिप्पणियों से संबंधित एक प्रश्न से जुड़ा है जो इसका उत्तर भी देता है।

एक सॉर्ट किए गए संग्रह में, आप सबसे अधिक संभावना आंतरिक डेटा संरचना में हेरफेर नहीं करना चाहते हैं यही वजह है कि वरीयता इंटरफ़ेस सूची इंटरफ़ेस को लागू नहीं करता है (क्योंकि इससे आपको इसके तत्वों तक सीधी पहुंच मिलेगी)।

यात्रा करने वाले पर PriorityQueueकैविटी

PriorityQueueवर्ग के औजार Iterable<E>और Collection<E>इंटरफेस तो यह हमेशा की तरह दोहराया जा सकता है। हालांकि, पुनरावृत्त तत्वों को सॉर्ट किए गए क्रम में वापस करने की गारंटी नहीं है। इसके बजाय (जैसा कि अदरथ टिप्पणी में बताते हैं) आपको poll()खाली होने तक कतार में रहने की आवश्यकता है ।

ध्यान दें कि आप सूची को किसी भी संग्रह में लेने वाले कंस्ट्रक्टर के जरिए प्राथमिकता कतार में बदल सकते हैं :

List<String> strings = new ArrayList<String>()
strings.add("lol");
strings.add("cat");

PriorityQueue<String> sortedStrings = new PriorityQueue(strings);
while(!sortedStrings.isEmpty()) {
    System.out.println(sortedStrings.poll());
}
// Prints out "cat" and "lol"

4. अपनी SortedListकक्षा लिखें

नोट: आपको ऐसा नहीं करना चाहिए।

आप अपनी सूची वर्ग लिख सकते हैं जो हर बार जब आप एक नया तत्व जोड़ते हैं। यह आपके कार्यान्वयन के आधार पर भारी गणना प्राप्त कर सकता है और व्यर्थ है , जब तक कि आप इसे अभ्यास के रूप में नहीं करना चाहते हैं, क्योंकि दो मुख्य कारण हैं:

  1. यह उस अनुबंध को तोड़ता है जो List<E>इंटरफ़ेस में है क्योंकि addविधियों को यह सुनिश्चित करना चाहिए कि उपयोगकर्ता द्वारा निर्दिष्ट सूचकांक में तत्व निवास करेगा।
  2. पहिया को क्यों मजबूत करें? आपको पहले बिंदु पर बताए गए अनुसार ट्रीसेट या मल्टीसेट्स का उपयोग करना चाहिए।

हालाँकि, यदि आप इसे एक अभ्यास के रूप में करना चाहते हैं तो आपको शुरू करने के लिए एक कोड नमूना है, यह AbstractListअमूर्त वर्ग का उपयोग करता है :

public class SortedList<E> extends AbstractList<E> {

    private ArrayList<E> internalList = new ArrayList<E>();

    // Note that add(E e) in AbstractList is calling this one
    @Override 
    public void add(int position, E e) {
        internalList.add(e);
        Collections.sort(internalList, null);
    }

    @Override
    public E get(int i) {
        return internalList.get(i);
    }

    @Override
    public int size() {
        return internalList.size();
    }

}

ध्यान दें कि यदि आपने अपनी ज़रूरत के तरीकों को ओवरराइड नहीं किया है, तो डिफ़ॉल्ट कार्यान्वयन से AbstractListफेंक दिया जाएगा UnsupportedOperationException


12
+1। Imo, यह शीर्ष वोट किए गए उत्तर की तुलना में अधिक रचनात्मक है। हालांकि यह दो मामूली गिरावट के साथ आता है। प्रायोरिटी क्यू रैंडम एक्सेस का समर्थन नहीं करता है। आप तिरछी नज़र नहीं कर सकते (elementIndex)। इसलिए आप ऐसा नहीं कर सकते Integer maxVal = prioQueue.peek(prioQueue.size() - 1);। दूसरी बात यह है कि यदि आप प्राथमिकता सूची को केवल क्रमबद्ध सूची के रूप में उपयोग करने का इरादा कर रहे PriorityQueueहैं SortedList, तो यह कोड में देखने के लिए कम सहज लगता है , जैसा कि यह देखने के लिए होता है , यदि ऐसी डेटा संरचना मौजूद है।
वृद्धनाथ

12
और, किसी अन्य प्रश्न को जो टिप्पणियों में जुड़ा हुआ है, को देखने के बाद, एक और बड़ा नुकसान यह है कि प्रायोरिटीक्यू के पुनरावृत्त को किसी भी विशिष्ट क्रम में तत्वों को वापस करने की गारंटी नहीं है। इसलिए, जब तक मैं किसी चीज़ की अनदेखी नहीं कर रहा हूं, उदाहरण के लिए प्रायोरिटी में सभी ऑब्जेक्ट्स को प्रिंट करने का एकमात्र तरीका बार-बार पोल () खाली होने तक कतार में है। मेरे लिए, यह सीमावर्ती लगता है। दो बार प्राथमिकता-पूर्व क्यू में वस्तुओं को प्रिंट करने के लिए, आपको पहले प्राथमिकता-क्रम से प्रतिलिपि बनाना होगा और फिर मूल प्राथमिकता से सभी ऑब्जेक्ट () और उसके बाद पोल () एल से सभी ऑब्जेक्ट को कॉपी करना होगा।
बुजुर्ग

1
हम्म ... लगता है कि तुम सही Alderath हो। तत्वों को अपेक्षित क्रम में प्राप्त करने के लिए आप प्रायोरिटीक्यू के पुनरावृत्त का उपयोग नहीं कर सकते। लगता है कि मुझे अपना उत्तर संपादित करना होगा।
13

7
प्राथमिकता कतार सिर्फ एक ढेर है, आप केवल शीर्ष पर पहुंच सकते हैं, यह प्रश्न के उत्तर से संबंधित नहीं है।
बेस्टसेन

1
यह भी ध्यान देने योग्य है कि Collections.sort()यहां तक ​​कि आपको Comparatorऑब्जेक्ट के उपयोग द्वारा सॉर्ट करने के लिए उपयोग किए जाने वाले तुलना फ़ंक्शन को भी परिभाषित करने देता है ।
माइक 'पोमैक्स' कामेरमेंस

71

क्योंकि सूची की अवधारणा स्वचालित रूप से छांटे गए संग्रह की अवधारणा के साथ असंगत है। एक सूची की बात यह है कि list.add(7, elem)कॉल करने के बाद , एक कॉल list.get(7)वापस आ जाएगी elem। ऑटो-सॉर्ट की गई सूची के साथ, तत्व एक मनमाना स्थिति में समाप्त हो सकता है।


26

चूंकि सभी सूचियों को पहले ही "क्रमबद्ध" कर दिया गया था, इस क्रम में आइटम जोड़े गए थे (एफआईएफओ ऑर्डरिंग), आप उन्हें अन्य ऑर्डर के साथ "रिसोर्ट" कर सकते हैं, जिसमें तत्वों के प्राकृतिक ऑर्डरिंग का उपयोग करना शामिल है java.util.Collections.sort()

संपादित करें:

डेटा संरचनाओं के रूप में सूचियां आधारित हैं जो कि दिलचस्प है ऑर्डर करना जिसमें आइटम सम्मिलित किए गए हैं।

सेट में वह जानकारी नहीं है।

यदि आप समय जोड़कर ऑर्डर करना चाहते हैं, तो उपयोग करें List। यदि आप अन्य मानदंडों द्वारा ऑर्डर करना चाहते हैं, तो उपयोग करें SortedSet


22
सेट डुप्लिकेट की अनुमति नहीं देता है
बेस्टसेल्स

10
मुझे नहीं लगता कि यह बहुत अच्छा जवाब है। ज़रूर, जावा एपीआई की सूचियों में एक विशिष्ट आदेश दिया जाता है कि आइटम कब / कैसे डाले गए थे। हालाँकि, सूचियों का अस्तित्व इस तरीके से किया गया है जो सम्मिलन विधि / समय पर निर्भर करता है, जिसमें अन्य डेटा संरचनाएँ शामिल नहीं होती हैं जिनमें क्रम दूसरे तरीके से निर्धारित किया जाता है (जैसे एक तुलनित्र द्वारा)। मूल रूप से, ओपी पूछ रहा है कि डेटा संरचना को उस अपवाद के साथ SortedSet के बराबर क्यों नहीं है कि डेटा संरचना को तत्वों के एकाधिक घटनाओं के लिए अनुमति देना चाहिए जो समान हैं।
वृद्धनाथ

5
तो मेरी अनुवर्ती प्रश्न ऊपर होगा: " क्यों कोई डेटा संरचना है जो एक SortedSet तरह काम करता है एकाधिक बराबर तत्व होते हैं जो कर सकते हैं, लेकिन? (और उत्तर नहीं देते कृपया" " क्योंकि सेट केवल एक ही तत्व शामिल कर सकते हैं ")
Alderath

@ वृद्ध: देखें stackoverflow.com/questions/416266/sorted-collection-in-java । संक्षेप में: अमरूद के ट्रीमुल्टिसेट का उपयोग करें
जानूस ट्रॉल्सन

4
सूचियाँ "क्रमबद्ध" नहीं हैं, भले ही आप दोहरे क्रमांक में "क्रमबद्ध" डालें। उन्हें आदेश दिया जाता है।
कोरे तुगे

20

सेट और मैप गैर-रैखिक डेटा संरचना हैं। सूची रैखिक डेटा संरचना है।

यहाँ छवि विवरण दर्ज करें


ट्री डेटा संरचना SortedSetऔर SortedMapइंटरफेस को लागू करता है TreeSetऔर TreeMapक्रमशः रेड-ब्लैक ट्री कार्यान्वयन एल्गोरिदम का उपयोग करता है। इसलिए यह सुनिश्चित करता है कि कोई डुप्लिकेट आइटम (या के मामले में चाबियाँ Map) नहीं हैं।

  • List पहले से ही एक आदेशित संग्रह और सूचकांक-आधारित डेटा संरचना रखता है, पेड़ कोई इंडेक्स-आधारित डेटा संरचना नहीं हैं।
  • Tree परिभाषा के अनुसार डुप्लिकेट नहीं हो सकते।
  • में Listहम डुप्लिकेट हो सकता है, इसलिए कोई TreeList(यानी कोई SortedList)।
  • सूची प्रविष्टि क्रम में तत्वों को बनाए रखती है। इसलिए यदि हम उस सूची को क्रमबद्ध करना चाहते हैं जिसका हमें उपयोग करना है java.util.Collections.sort()। यह निर्दिष्ट सूची को अपने तत्वों के प्राकृतिक क्रम के अनुसार आरोही क्रम में क्रमबद्ध करता है।

14

JavaFX SortedList

हालांकि इसमें कुछ समय लगा, Java 8 में एक हल है Listhttp://docs.oracle.com/javase/8/javafx/api/javafx/collections/transformation/SortedList.html

जैसा कि आप javadocs में देख सकते हैं, यह JavaFX संग्रह का एक हिस्सा है , जिसका उद्देश्य एक ऑब्ज़र्वरबलिस्ट पर सॉर्ट किए गए दृश्य प्रदान करना है।

अद्यतन: ध्यान दें कि जावा 11 के साथ, JavaFX टूलकिट JDK के बाहर चला गया है और अब एक अलग पुस्तकालय है। जावाएफ़एक्स 11 एक डाउनलोड करने योग्य एसडीके या मावेंनसेन्ट्राल से उपलब्ध है। Https://openjfx.io देखें


2
दुर्भाग्य से, यह SortedList एक सामान्य सूची की तरह काम नहीं करता है - उदाहरण के लिए, इसमें एक डिफ़ॉल्ट कंस्ट्रक्टर नहीं है (आपको इसे ऑब्जर्वरबलिस्ट का उपयोग करके निर्माण करना होगा, जो भी इसका अर्थ है ...)
Erel Segal-Halevi

JavaFX से SortedList स्पष्ट रूप से GUI- कंपोनेंट्स के उपयोग के लिए है और ओवरहेड के कारण केवल सॉर्ट की गई वस्तुओं की सूची के लिए अनुकूल नहीं है। इसके अलावा इसका मतलब पूरे एफएक्स मॉड्यूल को संदर्भित करना होगा, भले ही जीयूआई परियोजना में उपयोग नहीं किया गया हो।
COBRA.cH

1
@ COBRA.cH हां, यह सच है। एक अधिक प्रदर्शन करने वाली सॉर्ट की गई सूची शायद ट्रीपेज़ के चारों ओर एक पतली आवरण हो सकती है, जहां एक पूर्णांक का उपयोग कुंजी के डुप्लिकेट को गिनने के लिए किया जाता है। आप एक ट्रीसेट का उपयोग एक तुलनित्र के साथ भी कर सकते हैं जो कभी भी वापस नहीं आता है
16:24

क्यों डाउन वोट? सवाल एक अनुमान के साथ शुरू होता है कि जेडीके पुस्तकालयों में कोई क्रमबद्ध सूची नहीं है। यह उत्तर उस धारणा को सही करता है। चाहे आप इस विशेष सॉर्ट की गई सूची के कार्यान्वयन को पसंद करते हैं या अस्वीकार करते हैं, यह डाउन-वोट का कारण नहीं है। यह उत्तर वर्ग की सिफारिश नहीं करता है , केवल इसके अस्तित्व को इंगित करता है।
बेसिल बोर्के जूल

10

किसी भी नए लोगों के लिए, अप्रैल 2015 तक, एंड्रॉइड के पास अब समर्थन लाइब्रेरी में एक SortedList वर्ग है, जिसे विशेष रूप से काम करने के लिए डिज़ाइन किया गया है RecyclerView। यहाँ इसके बारे में ब्लॉग पोस्ट है।


1
इस टिप्पणी के समय पर ध्यान देने योग्य बात यह है कि Androids SortedList में RecItlerView के साथ onItemMoved () कार्यक्षमता के लिए समर्थन का अभाव है। अपनी खुद की SortedList लिखना जो कम कुशल है, जो मुझे सीमाओं के आसपास पाने के लिए करना था।
मैथ्यू

4

एक और बिंदु डालने के संचालन की समय जटिलता है। सूची सम्मिलित करने के लिए, कोई O (1) की जटिलता की अपेक्षा करता है। लेकिन इसकी सूची की सूची के साथ गारंटी नहीं दी जा सकती थी।

और सबसे महत्वपूर्ण बिंदु यह है कि सूचियां अपने तत्वों के बारे में कुछ भी नहीं मानती हैं। उदाहरण के लिए, आप उन चीजों की सूची बना सकते हैं जो लागू नहीं होती हैं equalsया compare


आप सूची w / O (logn) सम्मिलित / हटा / पा सकते हैं / शामिल कर सकते हैं लेकिन w / get (int) नहीं है।
बेस्टसेन

3
अंतिम बिंदु वास्तव में एक अच्छी व्याख्या नहीं है। आप उन SortedSetचीजों को बना सकते हैं जो लागू नहीं होते हैं Comparableइस ट्रीसेट कंस्ट्रक्टर को देखें ।
अहेरथ

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

सूचियाँ O (1) प्रविष्टि की गारंटी नहीं देती हैं , वे O (1) पहुँच की गारंटी देते हैं । bigocheatsheet.com
मैट

1
@ बिटलिस्ट आप सही कह रहे हैं! मैं अपनी टिप्पणी अपडेट नहीं कर सकता, लेकिन जावा Listइंटरफ़ेस अपने तरीकों पर किसी भी प्रदर्शन विनिर्देशों की गारंटी नहीं देता है।
मैट क्विगले

3

इस तरह यह के बारे में सोचो: Listइंटरफ़ेस की तरह तरीकों है add(int index, E element), set(int index, E element)। अनुबंध यह है कि एक बार जब आप स्थिति X पर एक तत्व जोड़ते हैं, तो आप इसे तब तक वहां पाएंगे जब तक कि आप इसके पहले तत्वों को जोड़ या हटा नहीं देते हैं।

यदि कोई सूची कार्यान्वयन तत्वों को सूचकांक के आधार पर छोड़कर किसी अन्य क्रम में संग्रहीत करेगा, तो उपरोक्त सूची विधियों का कोई मतलब नहीं होगा।


2

सूची API में पहली पंक्ति कहती है कि यह एक ऑर्डर किया गया संग्रह है (जिसे एक अनुक्रम के रूप में भी जाना जाता है)। यदि आप सूची को क्रमबद्ध करते हैं तो आप ऑर्डर को बनाए नहीं रख सकते हैं, इसलिए जावा में ट्रीलिस्ट नहीं है।
जैसा कि एपीआई का कहना है कि जावा सूची अनुक्रम से प्रेरित है और अनुक्रम गुण देखें http://en.wikipedia.org/wiki/Sequence_(mathematics )

इसका मतलब यह नहीं है कि आप सूची को क्रमबद्ध नहीं कर सकते हैं, लेकिन जावा उसकी परिभाषा के अनुसार सख्त है और डिफ़ॉल्ट रूप से सूची के क्रमबद्ध संस्करण प्रदान नहीं करता है।



2

यदि आप तत्वों को सॉर्ट करने का तरीका ढूंढ रहे हैं, लेकिन एक कुशल तरीके से इंडेक्स द्वारा उन्हें एक्सेस करने में सक्षम हैं, तो आप निम्न कार्य कर सकते हैं:

  1. भंडारण के लिए एक यादृच्छिक पहुँच सूची का उपयोग करें (उदाहरण के लिए ArrayList)
  2. सुनिश्चित करें कि यह हमेशा सॉर्ट किया गया है

फिर एक तत्व जोड़ने या हटाने के Collections.binarySearchलिए आप प्रविष्टि / निष्कासन सूचकांक प्राप्त करने के लिए उपयोग कर सकते हैं । चूंकि आपकी सूची यादृच्छिक पहुंच को लागू करती है, आप सूची को निर्धारित सूचकांक के साथ कुशलता से संशोधित कर सकते हैं।

उदाहरण:

/**
 * @deprecated
 *      Only for demonstration purposes. Implementation is incomplete and does not 
 *      handle invalid arguments.
 */
@Deprecated
public class SortingList<E extends Comparable<E>> {
    private ArrayList<E> delegate;

    public SortingList() {
        delegate = new ArrayList<>();
    }

    public void add(E e) {
        int insertionIndex = Collections.binarySearch(delegate, e);

        // < 0 if element is not in the list, see Collections.binarySearch
        if (insertionIndex < 0) {
            insertionIndex = -(insertionIndex + 1);
        }
        else {
            // Insertion index is index of existing element, to add new element 
            // behind it increase index
            insertionIndex++;
        }

        delegate.add(insertionIndex, e);
    }

    public void remove(E e) {
        int index = Collections.binarySearch(delegate, e);
        delegate.remove(index);
    }

    public E get(int index) {
        return delegate.get(index);
    }
}

1

अनुक्रमित-वृक्ष-मानचित्र का उपयोग करने पर विचार करें । यह एक बढ़ा हुआ JDK का ट्रीसेट है जो तत्व द्वारा सूचकांक तक पहुंच प्रदान करता है और पुनरावृत्ति या छिपी अंतर्निहित सूचियों के बिना तत्व के सूचकांक को खोजता है जो पेड़ का बैकअप लेता है। एल्गोरिथ्म हर बार बदलते नोड्स के अद्यतन को अद्यतन करने पर आधारित होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.