Problema di conversione da List <String> a ArrayList <String>


91

Ho un metodo seguente ... che in realtà prende l'elenco di frasi e divide ogni frase in parole. Eccolo:

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 questo elenco in una hashmap nel seguente formato

HashMap<String, ArrayList<String>>

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

Inoltre, se cambio ArrayList in List in una HashMap, ottengo

java.lang.UnsupportedOperationException

a causa di questa riga nel mio codice

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

Qualche suggerimento migliore?

Risposte:


53

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

Arrays.asListnon restituisce a java.util.ArrayList, quindi non è possibile assegnare il valore restituito di Arrays.asLista una variabile di tipo ArrayList.

Invece di:

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

Prova questo:

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

3
E in particolare UnsupportedOperationExceptionè causato dal fatto che il Arrays.asListmetodo restituisce un elenco di dimensioni fisse supportato da un array: non può essere modificato. La soluzione presentata qui da @Jesper lo eviterà.
Duncan Jones

191

Cast funziona dove l'istanza effettiva dell'elenco è un file ArrayList. Se è, ad esempio, a Vector(che è un'altra estensione di List), verrà generata un'eccezione ClassCastException.

L'errore durante la modifica della definizione della tua HashMap è dovuto agli elementi che vengono successivamente elaborati e quel processo si aspetta un metodo definito solo in ArrayList. L'eccezione ti dice che non ha trovato il metodo che stava cercando.

Creane uno nuovo ArrayListcon il contenuto di quello vecchio.

new ArrayList<String>(myList);

41

Dai un'occhiata a ArrayList # addAll (Collection)

Aggiunge tutti gli elementi nella raccolta specificata alla fine di questo elenco, nell'ordine in cui vengono restituiti dall'iteratore della raccolta specificata. Il comportamento di questa operazione non è definito se la raccolta specificata viene modificata mentre l'operazione è in corso. (Ciò implica che il comportamento di questa chiamata non è definito se la raccolta specificata è questo elenco e questo elenco non è vuoto.)

Quindi fondamentalmente potresti usare

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

13

In Kotlin List può essere convertito in ArrayList passandolo come parametro del costruttore.

ArrayList(list)

5

Arrays.asListnon restituisce l'istanza di java.util.ArrayListma restituisce l'istanza di java.util.Arrays.ArrayList.

Sarà necessario convertire in ArrayList se si desidera accedere a ArrayListinformazioni specifiche

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

0

Approccio provato e testato.

public static ArrayList<String> listToArrayList(List<Object> myList) {
        ArrayList<String> arl = new ArrayList<String>();
        for (Object object : myList) {
            arl.add((String) object);
        }
        return arl;

    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.