2013-04-17 15 views
21

Sto cercando di rimuovere elementi da un List e ottenere java.lang.UnsupportedOperationException.Perché List.remove (int) lancia java.lang.UnsupportedOperationException?

public <T extends Object> void findDuplicates(
     String title, Multimap<T, ChunkId> map) { 
     for (T key : map.keySet()) { 
      Collection<ChunkId> ids = map.get(key); 
      List<ChunkId> idList = (Arrays.asList(ids.toArray(new ChunkId[0]))); 
      removeUsedIds(idList); 
      Collections.sort(idList); 
//... 
     } 
    } 

    private void removeUsedIds(List<ChunkId> idList) { 
     // decrement counter to avoid indexing changed parts of list 
     for (int i = idList.size() - 1; i >= 0; i--) { 
      if (usedIdSet.contains(idList.get(i))) { 
       idList.remove(i); // **** Exception thrown here 
      } 
     } 
    } 

e ottengo

Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.remove(Unknown Source) 
    at org.xmlcml.svg2xml.analyzer.PDFIndex.removeUsedIds(PDFIndex.java:104) 
    at org.xmlcml.svg2xml.analyzer.PDFIndex.findDuplicates(PDFIndex.java:87) 
    at org.xmlcml.svg2xml.analyzer.PDFIndex.findDuplicatesInIndexes(PDFIndex.java:129) 
    at org.xmlcml.svg2xml.analyzer.PDFAnalyzer.analyzePDF(PDFAnalyzer.java:188) 
    at org.xmlcml.svg2xml.analyzer.PDFAnalyzer.analyzePDFFile(PDFAnalyzer.java:115) 
    at org.xmlcml.svg2xml.analyzer.PDFAnalyzer.main(PDFAnalyzer.java:398) 

NOTA: Questo è contrassegnato come un duplicato di remove() on List created by Arrays.asList() throws UnsupportedOperationException ma è significativamente diversa. Quel poster conosceva lo quale fosse il problema e voleva una spiegazione; I non sapeva quale fosse il problema e non riuscivo a trovarlo su SO pubblicando la domanda corrente. Java 6 docs (http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html) non fornisce alcun accenno al problema (la sua firma genera IndexOutOfBoundsException). La domanda precedente utilizzava anche removeAll() mentre questa domanda faceva riferimento a remove(int) in modo che la ricerca lessicale fosse meno precisa.

Ho quindi chiesto su SO e ho ottenuto risposte rapide e utili. Perché ho espresso il titolo esattamente (a differenza della domanda precedente) dovrebbe essere facile per gli altri trovare questa risposta. In meno di un giorno ha già quasi tanti voti rispetto alla domanda precedente in un anno (e oltre 100 visualizzazioni), il che suggerisce che sarà molto più utile. Poiché questa domanda è ora collegata alla precedente, penso che aggiunga all'utilità generale senza inquinare SO. (Le risposte attuali sono brevi e non ripetono inutilmente le informazioni.)

Ho modificato la domanda per rimuovere codice estraneo. Se questa domanda fosse stata disponibile quando ho incontrato il problema, mi avrebbe risparmiato un'ora!

+0

quale linea succede? – Infested

+0

Devi aggiungere un'altra informazione: che tipo di elenco hai precedentemente istanziato? – atk

+0

Contrassegnato come un duplicato perché il 'idList' che si sta passando al metodo' removeUsedIds() 'viene creato usando il metodo' Arrays.asList() ', che restituisce un wrapper Elenco attorno all'array, che non supporta la modifica. –

risposta

46

Si sta utilizzando un'implementazione List restituita da Arrays.asList(), che restituisce una raccolta a lunghezza fissa, pertanto un remove non è supportato.

13

Questo perché Arrays.asList() crea un elenco di wrapper su un array. Esattamente come la lunghezza dell'array non può essere cambiata, la lunghezza di questo elenco non può essere modificata.

Se si desidera creare lista "vera" pieno di elementi dell'array procedere come segue:

new ArrayList<ChunkId>(Arrays.asList(array))

34

Arrays#asList crea un elenco non modificabile :

Restituisce un fisso elenco delle dimensioni supportato dall'array specificato.

cercare di fare:

List<ChunkId> idList = new ArrayList(Arrays.asList(ids.toArray(new ChunkId[0]))); 

Invece di:

List<ChunkId> idList = (Arrays.asList(ids.toArray(new ChunkId[0]))); 
+0

https://stackoverflow.com/questions/2965747/why-do-i-get-an-unsupportedoperationexception-when-trying-to-remove-an-element-f – thanga

Problemi correlati