निकालें () Arrays.asList द्वारा बनाई गई सूची पर () UnsupportedOperationException फेंकता है


91

मेरे पास एक संग्रह c1<MyClass>और एक सरणी है a<MyClass>। मैं एक संग्रह करने के लिए सरणी परिवर्तित करने के लिए कोशिश कर रहा हूँ c2और क्या c1.removeAll(c2), लेकिन इस फेंकता है UnsupportedOperationException। मैंने पाया कि asList()एरेस क्लास का रिटर्न Arrays.ArrayListक्लास होता है और यह क्लास उसी removeAll()से विरासत में मिलती है, AbstractList()जिसके क्रियान्वयन की संभावना है UnsupportedOperationException

    Myclass la[] = getMyClass();
    Collection c = Arrays.asList(la);
    c.removeAll(thisAllreadyExistingMyClass);

क्या तत्वों को हटाने का कोई तरीका है? कृपया सहायता कीजिए


संबंधित प्रश्न: stackoverflow.com/questions/2965747/…
राम

जवाबों:


170

Arrays.asListListएक सरणी के चारों ओर एक आवरण देता है । इस आवरण का एक निश्चित आकार होता है और यह सीधे सरणी द्वारा समर्थित होता है, और इस तरह के कॉल के रूप setमें सरणी को संशोधित करने के लिए, और सूची को संशोधित करने वाले किसी भी अन्य तरीके से एक फेंक दिया जाएगा UnsupportedOperationException

इसे ठीक करने के लिए, आपको रैपर सूची की सामग्री की प्रतिलिपि बनाकर एक नई संशोधित सूची बनानी होगी। ArrayListनिर्माणकर्ता का उपयोग करके ऐसा करना आसान है Collection:

Collection c = new ArrayList(Arrays.asList(la));

1
मैं java.util.Arrays asList()विधि के लिए स्रोत कोड को देख रहा था , और यह एक वापस करने के लिए लगता है ArrayList। हालांकि, जब मैं एक करता System.out.println(list.getClass());हूं, मुझे मिलता है class java.util.Arrays$ArrayList। तो यह आंतरिक ArrayListवर्ग का उपयोग करता है , जिसमें एक विधि addया removeविधि नहीं है । मैं सोच रहा हूँ कि एक ArrayListका उपयोग करने के बजाय एक आंतरिक वर्ग होने का क्या मतलब है java.util.ArrayListऔर एक add()और remove()विधि क्यों नहीं है ?
अब्दुल

मेरी उपरोक्त टिप्पणी के लिए सुधार: इसमें एक addऔर removeतरीका है
अब्दुल

1
@ अब्दुल क्योंकि निश्चित आकार जैसी कोई चीज नहीं है java.util.ArrayListListयदि आप इसके साथ कुछ अवैध करते हैं (जैसे जोड़ना या निकालना), तो आप उस अपवाद को लागू करना चाहते हैं , और ArrayListउस आवश्यकता को पूरा नहीं करते हैं।
एटिने डे मार्टेल

@ अब्दुल Arrays.asListसिर्फ एक रैपर बनाता है List। लेकिन यह अभी भी एक है java.util.List, तो यह उन तरीकों होना चाहिए। लेकिन उन्हें लागू नहीं किया जा सकता है क्योंकि इससे विभिन्न आकार के साथ एक नया सरणी बनाने की ओर अग्रसर होगा। जो नहीं किया जा सकता क्योंकि संशोधन आप अभी भी कर सकते हैं लौटे सूची और मूल सरणी दोनों के माध्यम से किया जा सकता है। यह संभव नहीं होगा यदि लौटी हुई सूची बदल सकती है ताकि यह मूल सरणी संदर्भ को मूल रूप से फेंक दे।
एडम होज़ेक

13

हाँ, Arrays.asList(..)वह संग्रह है जिसे विस्तारित या सिकुड़ा नहीं जा सकता (क्योंकि यह मूल सरणी द्वारा समर्थित है, और इसे पुन: आकार नहीं दिया जा सकता है)।

यदि आप तत्वों को हटाना चाहते हैं या तो new ArrayList(Arrays.asList(..)सरणी से सीधे तत्व बना सकते हैं या हटा सकते हैं (जो लिखने में कम कुशल और कठिन होगा)


+1 यह उत्तर एकमात्र सही है: Arrays.asList () एक अपरिवर्तनीय सूची देता है - जो अपवाद को फेंक रहा है। इसका "सरणी द्वारा समर्थित" आदि होने से कोई लेना-देना नहीं है ... सभी ArrayLists सरणियों द्वारा समर्थित हैं - बड़ा सौदा।
बोहेमियन

1
लेकिन यदि आप आगे के डॉक्स में पढ़ेंगे, तो आपको पता चलेगा कि यह वास्तव में अ-अक्षम नहीं है ... "निर्दिष्ट सरणी द्वारा समर्थित निश्चित आकार की सूची लौटाता है। (लौटी सूची में परिवर्तन" के माध्यम से "लिखकर" एरे पर ले जाता है। ।) "-1, एटीन काफी सही है।
स्टीवन श्लैंस्कर

1
@Steven हाँ, इसीलिए यह "अचूक" या "केवल पढ़ने" के बजाय "निश्चित आकार" कहता है। वास्तव में, मैं अपने उत्तर को संपादित करने के लिए अभी जाऊंगा।
एटिएन डे मार्टेल

1
@ बोहेमियन, लौटा हुआ संग्रह 'मॉडिफाइड' है, क्योंकि 'सेट' पद्धति को कॉल करना संभव है।
javalearner

2
यदि आप इस तरह से नीट्स लेने जा रहे हैं, तो आप "ओपोज़िटेड अनाउंसमेंट एक्सप्रेशन स्टेटमेंट इन द कोड" के रूप में "इसे अनएवरेडऑपरेशनएक्सपेप्शन फेंकता है" जैसी अस्पष्ट बातें कह सकते हैं। एक API के उपभोक्ता इस बात की परवाह नहीं करते हैं कि कौन सा AbstractBlah सुपरक्लास एक अपवाद फेंक रहा है, वे परवाह करते हैं कि अनुबंध और वर्ग के उपयोग की अपेक्षाएं क्या हैं। जेवीएम वी + 1 में, यह पूरी तरह से संभव है कि कक्षा पुस्तकालय में परिवर्तन हो जहां अपवाद को फेंक दिया गया है - लेकिन अनुबंध नहीं बदलेगा।
स्टीवन श्लैंस्कर

7

यह तरीका Array.asList()काम करता है, क्योंकि यह सीधे सरणी द्वारा समर्थित है। पूरी तरह से परिवर्तनीय सूची प्राप्त करने के लिए, आपको संग्रह को स्वयं द्वारा बनाए गए संग्रह में क्लोन करना होगा।

Collection c = new ArrayList(Arrays.asList(la))

1
सूची परिवर्तनीय है लेकिन केवल सेट () के माध्यम से। लौटा हुआ संग्रह निश्चित आकार का है।
javalearner

मैंने वास्तव में कभी नहीं कहा कि यह असम्बद्ध है। बस एक (पूरी तरह से) परिवर्तनीय सूची प्राप्त करने के लिए आपको एक का उपयोग करना होगा ArrayList। अंतर शायद बहुत स्पष्ट नहीं था, हालांकि। :-) क्या सूची संशोधित करने योग्य है या नहीं यह परिभाषा का प्रश्न है, यह "अर्ध-परिवर्तनीय" है, लेकिन मेरे विचार में पूरी तरह से परिवर्तनीय नहीं है।
henko
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.