दिलचस्प पोस्ट
java.lang.RuntimeException: नतीजा देने वाले परिणाम ResultInfo {जो = नल, अनुरोध = 1888, परिणाम = 0, डेटा = शून्य} गतिविधि के लिए कैसे सी + + स्रोत कोड में एक CMake चर पढ़ने के लिए जावा में फ़ोकस किए बिना इनपुट के लिए सुनना डोमेन पर एक जावास्क्रिप्ट कुकी बनाने और इसे उप डोमेन भर में पढ़ना Jquery में लिपियों की तरह बाहरी सीएसएस फाइल लोड करें जो कि या तो में भी संगत है I jQuery टेक्स्ट फ़ेड / ट्रांज़िशन एक टेक्स्ट से दूसरे में? Linq में संस्थाओं के लिए स्ट्रिंग को बदलने में समस्या एक गतिविधि के कई उदाहरणों को रोकने के लिए कैसे करें जब इसे विभिन्न इन्टेंट्स के साथ लॉन्च किया जाता है Google एपीआई एपीआई अनुरोध एंड्रॉइड ऑटो-कॉम्पले के लिए निषेध है, यहां तक ​​कि सही एपीआई कुंजी के साथ भी एडीबी शेल का उपयोग कैसे करें जब एक से अधिक डिवाइस जुड़े हुए हों? "त्रुटि: एक से अधिक डिवाइस और एमुलेटर" के साथ विफल हैंडलर बनाम एसिंक टास्क बनाम थ्रेड Django: एक मॉडल को सहेजते समय यूजर आईडी को पॉप्युलेट करें कैसे PHP में एक ईमेल को मान्य है? Bitfields में क्यों एक बिट endianness मुद्दा है? दृश्य सी ++: # एक ही समाधान में अन्य परियोजनाओं से फ़ाइलें शामिल करें

जावा में कोई क्रमबद्ध सूची क्यों नहीं है?

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

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

कोई विचार क्यों ऐसा बनाया गया है?

वेब के समाधान से एकत्रित समाधान "जावा में कोई क्रमबद्ध सूची क्यों नहीं है?"

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

मैं व्यक्तिगत रूप से देखने के तरीके के अनुसार उपयोगिता के आदेश देता हूँ:

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

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

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

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

 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 , जो TreeMultiset तरह बहुत काम करता है।

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" 

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

एक स्पष्ट लाभ यह है कि आप sort पद्धति में Comparator का उपयोग कर सकते हैं। जावा Collator जैसे 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 Iterable<E> श्रेणी में Iterable<E> और Collection<E> इंटरफेस लागू होता है, इसलिए इसे सामान्य रूप से दोहराया जा सकता है हालांकि क्रमबद्ध क्रम में तत्वों को वापस करने के लिए इटरेटर की गारंटी नहीं है इसके बजाय (जैसा कि एल्डेरैथ टिप्पणी में बताता है) आपको रिक्त होने तक कतार में poll() करने की आवश्यकता है 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. क्यों पहिया reinvent? आपको ट्रीसेट या मल्टीस्सेट का प्रयोग करना चाहिए, जैसा कि पहले बिंदु पर बताया गया है।

हालांकि यदि आप इसे एक अभ्यास के रूप में करना चाहते हैं तो आपको शुरू करने के लिए एक कोड नमूना है, यह AbstractList सार 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 एस को फेंक देगा

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

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

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

सूचियों के रूप में डेटा स्ट्रक्चर्स क्या दिलचस्प है में आधारित हैं आदेश है जिसमें मदों को डाला।

समूह की जानकारी नहीं है

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

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

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

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


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

  • परिभाषा से ट्री में डुप्लिकेट नहीं हो सकते
  • List हमारे पास डुप्लिकेट हो सकते हैं, इसलिए कोई TreeList नहीं है

इसलिए यदि हम सूची को सॉर्ट करना चाहते हैं तो हमें java.util.Collections.sort() का उपयोग करना होगा।

एक और मुद्दा यह है कि सम्मिलित संचालन की समय जटिलता है। एक सूची डालने के लिए, ओ (1) की जटिलता की उम्मीद है। लेकिन इसकी एक सॉर्टेड सूची के साथ इसकी गारंटी नहीं दी जा सकती।

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

हालांकि थोड़ी देर के लिए, जावा 8 में सॉर्ट किया गया सूची है http://docs.oracle.com/javase/8/javafx/api/javafx/collections/transformation/SortedList.html

जैसा कि आप जवाडॉक्स में देख सकते हैं, यह जावाएफएक्स संग्रह का हिस्सा है, जिसका उद्देश्य एक ObservableList पर एक सचित्र दृश्य प्रदान करना है।

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

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

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

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

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