2012-05-10 9 views
7

ho voluto mettere alla prova come ottenere intersezione tra due liste, qui è il mio codice:eccezione Lista 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)); 

Questo produce:

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) 

Ma io non sto facendo nessun rimuove. Perché questa eccezione produce?

Aggiornamento I:

Usando:

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

produce:

java.util.ConcurrentModificationException 

Dal lista2 è sostenuta da lista1, la rimozione di elementi da lista1 farò questa eccezione. Versione Infine lavorando:

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

o

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

o

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

Grazie per le vostre risposte a tutti.

risposta

16

Quando si utilizza Arrays.asList, si ottiene un elenco supportato dall'array effettivo passato con funzionalità limitata. Se vuoi un elenco completamente modificabile devi creare un nuovo elenco. Per esempio:

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

'UnsupportedOperationException' - se l'operazione' retainAll' non è supportata da questa raccolta. – user845279

+0

Usando il tuo esempio ottengo Exception in thread "main" java.util.ConcurrentModificationException –

+0

Questo perché hai usato la funzione 'subList()'. 'list2' è supportato da' list'. La funzione 'retainAll' usa un iteratore per cancellare i valori non intersecanti - questo causa' ConcurrentModificationException'. Puoi leggere 'Iterator' e le modifiche simultanee su Javadocs. – user845279

0

retainAll rimuove tutti gli elementi non presenti nell'elenco.

3

Come il documentation dice, il metodo List.retainAll()

conserva solo gli elementi in questo elenco che sono contenuti nella collezione specificata (operazione facoltativa). In altre parole, rimuove da questo elenco tutti gli elementi che non sono contenuti nella raccolta specificata. [emphasis mine]

0

documentazione dice anche che retainAll getta UnsupportedOperationException quando implementazione Lista non supporta questo metodo.