2009-10-26 11 views
34

द्वारा लौटाई गई सूची से निकालने का प्रयास करते समय मैं विधि को कॉल करके प्राप्त कुछ डेटा रखने के लिए List का उपयोग कर रहा हूं। तो मैं myList.Remove(int i) विधि का उपयोग कर तत्व को निकालने का प्रयास कर रहा हूं। लेकिन जब मैं ऐसा करने की कोशिश करता हूं तो मुझे UnsupportedOperationException मिल रहा है। इसके लिए क्या कारण होगा? मुझे इस समस्या को कैसे हल करना चाहिए?UnsupportedOperationException Array.asList

उत्तर

53

Array.asList()wraps सूची इंटरफ़ेस में एक सरणी का प्रयास करें। सूची अभी भी सरणी द्वारा समर्थित है। Arrays एक निश्चित आकार हैं - वे तत्व जोड़ने या हटाने का समर्थन नहीं करते हैं, इसलिए रैपर या तो नहीं कर सकता है।

डॉक्स के रूप में वे हो सकता है इस के रूप में स्पष्ट नहीं कर सकता है, लेकिन वे कहते हैं कि कर :

एक निश्चित-आकार सूची निर्दिष्ट सरणी द्वारा समर्थित देता है।

"निश्चित-आकार" बिट एक संकेत है कि आप जोड़ सकते हैं या तत्वों :)

नहीं निकाल सकते होना चाहिए हालांकि यह चारों ओर अन्य तरीकों (एक सरणी से एक नया ArrayList बनाने के लिए अन्य तरीके हैं) अतिरिक्त पुस्तकालयों के बिना, मैं व्यक्तिगत रूप से Google Collections Library (या Guava, जारी होने पर) को पकड़ने की अनुशंसा करता हूं)। इसके बाद आप उपयोग कर सकते हैं:

List<Integer> list = Lists.newArrayList(array); 

कारण मैं इस सुझाव दे रहा हूँ कि GCL एक आम तौर पर अच्छी बात है, और अच्छी तरह से उपयोग कर रहा लायक है।

टिप्पणियों में उल्लेख के अनुसार, यह एरे के कॉपी करता है; सूची मूल सरणी द्वारा समर्थित नहीं है, और किसी भी संग्रह में परिवर्तन दूसरे में नहीं देखा जाएगा।

+1

+1 सहमत है। हालांकि, मुझे लगता है कि यह ध्यान देने योग्य है कि मूल विधि मूल सरणी द्वारा समर्थित एक सूची लौटाती है, और मूल सरणी में "लिखने के माध्यम से" बदलती है। इसका उपयोग मूल सूची द्वारा समर्थित एक सूची नहीं लौटाएगा, और इस लौटाई गई सूची में किए गए किसी भी बदलाव से मूल सरणी प्रभावित नहीं होगी। – Snekse

+0

के लिए – desau

+0

@ डीसौ: मैंने इसे इंगित करने के लिए संपादित किया है। –

5

जैसा कि आप asist से प्राप्त कार्यान्वयन को एक पूर्ण सूची इंटरफ़ेस लागू नहीं करते हैं। मैं सूची को ArrayList में बदल दूंगा और फिर उस पर संशोधन करूँगा।

देखें http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html#remove%28int%29

+0

निकाल सकते हैं आप इस सूची से अधिक पुनरावृत्ति मतलब और करने के लिए सभी वस्तुओं डाल शुरुआत में एक ArrayList ?? –

+0

नहीं, ऐरेलिस्टिस्ट कन्स्ट्रक्टर एक संग्रह के रूप में संग्रह लेता है, ताकि आप केवल नए ऐरेलिस्ट को कॉल कर सकें। –

17

यह java.util.ArrayList नहीं है। Arrays.asList() अपना खुद का List कार्यान्वयन देता है और यह निष्कासन का समर्थन नहीं करता है। आप इसे से एक असली ArrayList बना सकते हैं:

new java.util.ArrayList(Arrays.asList(someArray)); 

यह बहुत भ्रमित कैसे asList() काम करता है, मैं मानता चाहिए है।

0

क्योंकि आपको केवल-पढ़ने वाली सूची मिलती है।

List newList = new ArrayList(myList); 
+4

यह केवल पढ़ने के लिए नहीं है - यह केवल निश्चित आकार है। Google Guava –

6

कृपया Arrays.asList() के लिए एपीआई डॉक्स पढ़ें:

एक निश्चित-आकार सूची निर्दिष्ट सरणी द्वारा समर्थित देता है। (लौटे सूची में किए गए परिवर्तन सरणी करने के लिए "के माध्यम से लिखना"।)

ध्यान दें कि Collections.remove (पूर्णांक) एक "वैकल्पिक आपरेशन 'के रूप में Javadocs में चिह्नित है, सभी संग्रह नहीं यह समर्थन करेंगे जिसका अर्थ है। "निश्चित आकार सूची" का अर्थ है कि आप सूची के आकार को नहीं बदल सकते हैं, जो हटाएगा() करेगा। तो यह समर्थित नहीं है।

यदि आप Arrays.asList() द्वारा जेनरेट की गई सूची को बदलना चाहते हैं, तो बस इसे कॉपी करें, उदा। new ArrayList(Arrays.asList(...))

0

उपयोग

सूची के बजाय ArrayList

सूची का आकार तत्व तय किया है, सूची अलावा आइटम है और न ही न आइटम

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