2012-10-30 18 views
44

Ho un metodo seguente ... che in realtà prende l'elenco di frasi e divide ogni frase in parole. Qui è:Lista <String> a ArrayList <String> problema di conversione

public List<String> getWords(List<String> strSentences){ 
allWords = new ArrayList<String>(); 
    Iterator<String> itrTemp = strSentences.iterator(); 
    while(itrTemp.hasNext()){ 
     String strTemp = itrTemp.next(); 
     allWords = Arrays.asList(strTemp.toLowerCase().split("\\s+"));   
    } 
    return allWords; 
} 

devo passare questa lista in una HashMap in un formato seguente

HashMap<String, ArrayList<String>> 

quindi questo metodo restituisce List e ho bisogno di un arrayList? Se provo a lanciarlo non allenamento ... qualche suggerimento?

Inoltre, se cambio l'ArrayList a lista in un HashMap, ottengo

java.lang.UnsupportedOperationException 

a causa di questa linea nel mio codice

sentenceList.add(((Element)sentenceNodeList.item(sentenceIndex)).getTextContent()); 

Eventuali suggerimenti migliori?

risposta

33

Prima di tutto, perché è la mappa a HashMap<String, ArrayList<String>> e non a HashMap<String, List<String>>? C'è qualche ragione per cui il valore deve essere un'implementazione specifica dell'interfaccia List (ArrayList in questo caso)?

Arrays.asList non restituisce un java.util.ArrayList, quindi non è possibile assegnare il valore di ritorno di Arrays.asList ad una variabile di tipo ArrayList.

Invece di:

allWords = Arrays.asList(strTemp.toLowerCase().split("\\s+")); 

Prova questo:

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+"))); 
+2

E in particolare il 'UnsupportedOperationException' è causato perché il metodo' Arrays.asList' restituisce un elenco di dimensioni fisse supportato da un array - non può essere modificato. La soluzione presentata qui da @Jesper lo eviterà. –

+0

grazie ... è risolto – Skipper07

4

Arrays.asList non restituisce l'istanza di java.util.ArrayList ma restituisce l'istanza di java.util.Arrays.ArrayList.

Sarà necessario convertire ArrayList se si desidera accedere ArrayList informazioni specifiche

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+"))); 
100

Fusioni opere in cui l'istanza effettiva della lista è un ArrayList. Se è, per esempio, un Vector (che è un'altra estensione di List) genererà un ClassCastException.

L'errore durante la modifica della definizione di HashMap è dovuto agli elementi successivamente elaborati e tale processo prevede un metodo definito solo in ArrayList. L'eccezione ti dice che non ha trovato il metodo che cercava.

Creare un nuovo ArrayList con il contenuto di quello vecchio.

new ArrayList<String>(myList); 
+1

Personalmente ritengo questa è la risposta più leggibile – SARose

20

Date un'occhiata a ArrayList#addAll(Collection)

Aggiunge tutti gli elementi della collezione specificato alla fine del questa lista, nell'ordine in cui essi vengono restituiti dal Iterator specificato della collezione. Il comportamento di questa operazione non è definito se la raccolta specificata viene modificata mentre l'operazione è in avanzamento . (Ciò implica che il comportamento di questa chiamata è indefinito se la raccolta specificato è questa lista, e questo elenco è non vuota.)

Quindi, in pratica si potrebbe usare

ArrayList<String> listOfStrings = new ArrayList<>(list.size()); 
listOfStrings.addAll(list); 
Problemi correlati