2012-05-10 3 views
7

मैं, कैसे दो सूचियों के बीच चौराहे प्राप्त करने के लिए परीक्षण करने के लिए चाहता था यहाँ मेरी कोड है:सूची retainAll अपवाद

  List<Integer> list = Arrays.asList(16, 17, 18, 19, 20); 
     List<Integer> list2 = list.subList(2, 5); 

     System.out.println(list.subList(2, 5)); 
     System.out.println(list.containsAll(list.subList(2, 5))); 
     System.out.println(list.retainAll(list2)); 

यह पैदा करता है:

Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.remove(Unknown Source) 
    at java.util.AbstractList$Itr.remove(Unknown Source) 
    at java.util.AbstractCollection.retainAll(Unknown Source) 
    at gov.noaa.nhc.App.main(App.java:48) 

लेकिन मैं किसी भी हटा नहीं कर रहा हूँ। यह उत्पादन अपवाद क्यों है?

अद्यतन मैं:

का उपयोग करना:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = list.subList(2, 5); 

का उत्पादन:

java.util.ConcurrentModificationException 

List2 के बाद से, List1 के द्वारा समर्थित है List1 से आइटम निकालने के इस अपवाद का कारण होगा। अंत में काम कर रहे संस्करण:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = Arrays.asList(18, 19, 20); 

या

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(18, 19, 20)); 

या

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5)); 

अपने जवाब हर किसी के लिए धन्यवाद।

उत्तर

16

जब आप Arrays.asList का उपयोग करते हैं, तो आपको प्रतिबंधित कार्यक्षमता के साथ पारित वास्तविक सरणी द्वारा समर्थित एक सूची मिलती है। यदि आप पूरी तरह से संशोधित सूची चाहते हैं तो आपको एक नई सूची बनाना होगा। उदाहरण के लिए:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20)); 
List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5)); 
list.retainAll(list2); 
System.out.println(list); 
// result: [18, 19, 20] 
+0

'असमर्थित ऑपरेशन अपवाद' - यदि इस संग्रह द्वारा 'retainAll' ऑपरेशन समर्थित नहीं है। – user845279

+0

आपके उदाहरण का उपयोग करके मुझे थ्रेड "मुख्य" java.util.ConcurrentModificationException –

+0

में अपवाद मिलता है क्योंकि ऐसा इसलिए है कि आपने 'subList()' फ़ंक्शन का उपयोग किया था। 'list2' को 'सूची' द्वारा समर्थित किया गया है। 'RetainAll' फ़ंक्शन गैर अंतरण मूल्यों को हटाने के लिए एक पुनरावर्तक का उपयोग करता है - इससे 'ConcurrentModificationException' का कारण बनता है। आप जवाडॉक्स पर 'इटरेटर' और समवर्ती संशोधन के बारे में पढ़ सकते हैं। – user845279

1

retainAll उस सूची से आइटम हटा देता है जिस पर इसे लागू किया जाता है।

0

retainAll उन सभी तत्वों को हटा देता है जो दी गई सूची में नहीं हैं।

3

documentation कहते हैं, List.retainAll() विधि

इस सूची में केवल तत्वों को निर्दिष्ट संग्रह (वैकल्पिक आपरेशन) में निहित हैं बरकरार रखती है। दूसरे शब्दों में, इस सूची से हटाता है जो सभी तत्व निर्दिष्ट संग्रह में शामिल नहीं हैं। [जोर मेरा]

0

प्रलेखन भी कहता है कि retainAll फेंकता UnsupportedOperationException जब सूची कार्यान्वयन इस विधि का समर्थन नहीं करता।

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