2012-05-17 2 views
7

मैं अपनी सूची से विशिष्ट तत्वों को हटाना चाहता हूं। मैं सूची के माध्यम से पुनरावृत्ति करते समय ऐसा नहीं करना चाहता हूं। मैं उस मान को निर्दिष्ट करना चाहता हूं जिसे हटाया जाना है। javadocs में मैं समारोह List.remove(Object 0) पाया यह मेरा कोड है:जावा में एक सूची <String> से एक मूल्य को हटाकर java.lang.UnsupportedOperationException

  String str="1,2,3,4,5,6,7,8,9,10"; 
     String[] stra=str.split(","); 
     List<String> a=Arrays.asList(stra); 
     a.remove("2"); 
     a.remove("3"); 

लेकिन मैं एक अपवाद प्राप्त करें: java.lang.UnsupportedOperationException

उत्तर

22

समस्या यह है कि Arrays.asList() (एक सूची है कि प्रविष्टि/हटाने का समर्थन नहीं करता यह बस है देता है एक दृश्यstra पर)।

ठीक करने के लिए, परिवर्तन:

List<String> a = Arrays.asList(stra); 

रहे हैं:

List<String> a = new ArrayList<String>(Arrays.asList(stra)); 

इस सूची की एक प्रतिलिपि बनाता है, आप इसे संशोधित करने के लिए अनुमति देता है।

+0

यह काम करता है। धन्यवाद मेरी विधि के साथ क्या गलत था। सूची ए = Arrays.asList (stra); इस लाइन में अपवाद नहीं फेंक दिया गया था। – Ashwin

+0

@ अश्विन: वह पंक्ति ठीक थी। हालांकि, 'Arrays.asList()' द्वारा उत्पादित सूची केवल पढ़ने के लिए है, इसलिए आप इसे संशोधित नहीं कर सकते हैं। आपको पहले एक प्रतिलिपि बनाना है। – NPE

+0

ठीक है .. मेरी विधि के साथ सूची सिर्फ स्ट्रिंग [] मानों को सीधे अपनी प्रतिलिपि बनाये बिना एक्सेस कर रही थी? तो अगर किसी भी बदलाव की अनुमति है तो वे स्ट्रिंग [] को भी प्रभावित करेंगे? – Ashwin

2

http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList%28T...%29

इस देखें। Arrays.asList एक निश्चित सूची देता है। जो एक अपरिवर्तनीय है। इसकी परिभाषा के अनुसार आप उस वस्तु को संशोधित करने के बाद संशोधित नहीं कर सकते हैं। यह क्यों असमर्थित अपवाद फेंक रहा है।

+1

एक स्ट्रिंग भी अपरिवर्तनीय है। लेकिन जब आप एक स्ट्रिंग को संशोधित करते हैं तो इसे एक नया मेमोरी स्थान आवंटित किया जाता है और आंतरिक रूप से एक नई स्ट्रिंग बनाई जाती है। तो प्रभावी ढंग से आप एक अपरिवर्तनीय स्ट्रिंग को संशोधित कर सकते हैं। तो मुझे नहीं लगता कि यहां कारण यह है कि लौटाई गई सूची अपरिवर्तनीय है। मुझे लगता है कि ऐसा इसलिए है क्योंकि जब आप Arrays.asList() कर रहे हैं तो यह केवल स्ट्रिंग का संदर्भ देता है [] (स्ट्रिंग [] की प्रतिलिपि नहीं करता है और एक सूची बनाता है)। – Ashwin

+0

यदि आप एरेज़ क्लास में अरिललिस्ट को आंतरिक कक्षा कॉल में देखते हैं तो आपको इस तथ्य का एहसास होगा कि इसे संशोधित नहीं किया जा सकता है। बस यह एक निजी अंतिम ई [] ए का उपयोग करें; यही कारण है कि आप वापसी सूची को संशोधित नहीं कर सकते हैं। स्ट्रिंग के मामले में आप बनाए जाने के बाद एक स्ट्रिंग को संशोधित नहीं कर सकते। लेकिन स्ट्रिंग क्लास एपीआई में इस तरह से विकसित किया गया है कि यह एक नई वस्तु बनाकर आंतरिक रूप से संशोधनों को संभालेगा। –

+0

तो आप कह रहे हैं कि यह स्ट्रिंग की एक प्रति बनाता है [] लेकिन इसे अंतिम के रूप में घोषित करता है। क्या आप कह रहे हैं कि यह स्ट्रिंग [] का संदर्भ नहीं देता है और अपनी प्रतिलिपि बनाता है (लेकिन अंतिम के रूप में)? – Ashwin