2009-11-25 16 views
19

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

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

किसी भी मदद की सराहना की जाती है।

+2

क्या आप सूची को कॉपी करने के लिए उपयोग कर रहे कोड को दिखा सकते हैं? – theycallmemorty

उत्तर

19

आप Collections.emptyList() का उपयोग कर एक खाली सूची बनाने रहे हैं? यदि ऐसा है, तो यह एक अपरिवर्तनीय सूची भी है और यह आपकी समस्या का स्रोत हो सकता है।

ऐसे new ArrayList() के रूप में, अपने सूची लागू करने के लिए निर्माता का उपयोग कर एक नई सूची बनाएं। आप मूल सूची को कन्स्ट्रक्टर में पास कर सकते हैं या अन्यथा addAll() विधि का उपयोग कर सकते हैं।

34
List unmodifiableList = Collections.unmodifiableList(list); 

    List newList = new ArrayList(unmodifiableList); 

    Collections.sort(newList); 

ArrayList के निर्माता किसी मौजूदा सूची लेता है, उसके तत्वों (उन्हें संशोधित किए बिना!) पढ़ता है, और उन्हें नए सूची में जोड़ता है।

0

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

लगता त्रुटि कहीं और है, सबसे अच्छा google-collections के साथ अपने कोड :)

38

Fwiw, दिखाने के लिए होगा यह एक-लाइनर है:

List<Foo> sorted = Ordering.natural().sortedCopy(unmodifiableList); 
+2

विज्ञापन की तरह दिखता है ... मुझे यह पसंद है। – whiskeysierra

+1

सिर्फ इसलिए कि "google" शब्द है? : वैसे भी। यह एक विज्ञापन है। एक जो संभवतः अवैतनिक है। –

0

मैं अपने दूसरे सवाल का जवाब देगा:

आप अपनी 'taskListModifiable' सूची में नहीं जोड़ सकते हैं क्योंकि यह एक 'अपरिवर्तनीय' सूची है, जिसका अर्थ जावा में है कि यह अपरिवर्तनीय है। किसी भी प्रकार की एक अपरिवर्तनीय/अपरिवर्तनीय सूची या संग्रह किसी भी तरह से सीधे नहीं बदला जा सकता है - आप इसमें तत्व नहीं जोड़ सकते हैं, इससे तत्व हटा सकते हैं, या मौजूदा तत्वों के संदर्भ बदल सकते हैं।

ध्यान दें कि सूची/संग्रह में मौजूदा तत्वों अगर वे खुद को परिवर्तनशील हैं बदला जा सकता है, लेकिन सूची से उन्हें संदर्भ बदला नहीं जा सकता। यही है, जब तक कि सूची पूरी तरह से दायरे से बाहर नहीं हो जाती है और कचरा इकट्ठा किया जाता है, तब तक अप्रचलित सूची में हमेशा वही संदर्भ होंगे।

अब, आपके मामले में, Collections.emptyList() एक unmodifiable EMPTY सूची देता है। यह वास्तव में हमेशा एक ही उदाहरण है क्योंकि यह अपरिवर्तनीय और हमेशा खाली है। इस नियम के कारण आप इसमें शामिल नहीं हो सकते हैं कि एक अपरिवर्तनीय सूची का विस्तार नहीं किया जा सकता है (इसमें जोड़ा गया है)। चूंकि यह खाली है, इसमें कुछ भी नहीं है जिसे बदला जा सकता है।

मैं बनाने के लिए यह और भी स्पष्ट कर दिया कि Collection.emptyList() एक खाली सूची का निर्माण नहीं करता जोड़ना चाहिए। यह सिर्फ एक सिंगलटन सूची उदाहरण का संदर्भ देता है।

+2

unmodifiable * जावा में अपरिवर्तनीय नहीं है !!यदि आप 'list1' के बाद एक अपरिवर्तनीय सूची बनाते हैं, और फिर आप' list1' पर ऑब्जेक्ट्स को जोड़/हटाते हैं, तो अपरिवर्तनीय सूची परिवर्तनों को प्रतिबिंबित करेगी। –

+0

यह किसी भी भाषा के लिए सच है जहां अनौपचारिक संग्रह सिर्फ अन्य संग्रह को लपेटता है (उदाहरण के लिए एक सुरक्षित प्रति नहीं बनाता है), न केवल जावा। आप लपेटा हुआ ऑब्जेक्ट का संदर्भ बनाए रखने और उसे बदलने के बारे में बात कर रहे हैं। हालांकि, मैं एक टिप्पणी कर रहा था (जो मैं नहीं कर सका) एक और जवाब में जहां वे पूछ रहे थे कि वे विशिष्ट कार्यसूची को बदल नहीं सकते हैं, जहां यह इसके साथ बनाया गया था: taskListModifiable = Collections.emptyList()। असल में, सभी मामलों में, यह अपरिवर्तनीय है क्योंकि खाली सूची() एक अपरिवर्तनीय, सिंगलटन, खाली सूची देता है। –

+0

@ ट्राउ सॉफ़्ट: हाँ, आप सही हैं, कुछ "अपरिवर्तनीय" सूचियों के अंदर बैकिंग सूची वास्तव में संशोधित है। यह सच है कि यह सख्ती से अपरिवर्तनीय नहीं है और आप इसे इस तरह से इलाज नहीं कर सकते हैं। हालांकि, अभ्यास में आप अक्सर सूची बना सकते हैं, फिर इसे अपरिवर्तनीय बनाते हैं, फिर प्रारंभिक सूचक को सूची में फेंक दें। –

4

जावा 8 में, आप धाराओं एपीआई का उपयोग कर सकते हैं। उदाहरण के लिए:

List<?> sortedList = unsortedList.stream().sorted().collect(Collectors.toList()); 
संबंधित मुद्दे