2015-01-23 38 views
9

Sto tentando di rimuovere alcuni elementi da un List, ma anche gli esempi più semplici, come quelli in this answer o this, non funzioneranno.UnsupportedOperationException quando si utilizza iterator.remove()

public static void main(String[] args) 
{ 
    List<String> list = Arrays.asList("1", "2", "3", "4"); 
    for (Iterator<String> iter = list.listIterator(); iter.hasNext();) 
    { 
     String a = iter.next(); 
     if (true) 
     { 
      iter.remove(); 
     } 
    } 
} 

Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.remove(Unknown Source) 
    at java.util.AbstractList$Itr.remove(Unknown Source) 

Utilizzando un normale Iterator invece di un ListIterator non aiuta. Cosa mi manca? Sto utilizzando Java 7.

risposta

20

Arrays.asList() restituisce una lista, sostenuto dalla matrice originale. Le modifiche apportate all'elenco si riflettono anche nell'array che si passa. Poiché non è possibile aggiungere o rimuovere elementi agli array, anche questo è impossibile da fare agli elenchi, creato in questo modo, ed è per questo che la chiamata remove ha esito negativo. È necessaria un'implementazione diversa di List (ArrayList, LinkedList, ecc.) Se si desidera poter aggiungere e rimuovere elementi in modo dinamico.

+0

Non è il punto centrale di un linguaggio OO sicuro come Java non avere sottoclassi che non supportano i metodi delle superclassi? – Yamcha

+0

@Yamcha yeah ... java non è un linguaggio molto ben progettato. Se stai cercando delle alternative, ti consiglio la scala. – Dima

22

Questa è solo una caratteristica del Arrays.asList() ed è stato chiesto prima di vedere this question

Si può solo avvolgere questo in un nuovo elenco

List list = new ArrayList(Arrays.asList("1",...)); 
-2

Crea un nuovo elenco con gli elementi che desideri rimuovere, quindi chiama il metodo removeAll.

List<Object> toRemove = new ArrayList<Object>(); 
for(Object a: list){ 
    if(true){ 
     toRemove.add(a); 
    } 
} 
list.removeAll(toRemove); 
+0

se downvoting, si prega di fornire almeno un motivo per cui sanno cosa c'è che non va – Ascalonian

+1

Non è il downvoter, ma 'removeAll()' è implementato in 'AbstractCollection', e usa' Iterator.remove() '. Quindi, se 'Iterator.remove()' non funziona, 'removeAll()' non funzionerà. –

+0

@Ascalonian enumerando tutti i motivi per cui questo è sbagliato non rientrerebbe in un commento :) Per una volta, non funziona affatto come ha spiegato FlorentBayle. Inoltre, non (tenta di) rispondere alla domanda (perché il codice dell'OP non funziona). Usa cose come 'List ' che è inutile, fuorviante e cattiva pratica. Sarebbe una pessima implementazione (N^2) se funzionasse. Non fa alcun tentativo di spiegare il motivo per cui l'autore pensa che questo debba essere fatto in modo così diretto. Ecc. – Dima

Problemi correlati