Problème de conversion List <String> vers ArrayList <String>

91

J'ai une méthode suivante ... qui prend en fait la liste des phrases et divise chaque phrase en mots. Le voici:

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;
}

Je dois passer cette liste dans un hashmap dans un format suivant

HashMap<String, ArrayList<String>>

donc cette méthode retourne List et j'ai besoin d'un arrayList? Si j'essaye de lancer, ça ne fait pas de sport ... des suggestions?

De plus, si je change la ArrayList en List dans un HashMap, j'obtiens

java.lang.UnsupportedOperationException

à cause de cette ligne dans mon code

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

De meilleures suggestions?

Skipper07
la source

Réponses:

53

Tout d'abord, pourquoi la carte est-elle un HashMap<String, ArrayList<String>>et non un HashMap<String, List<String>>? Y a-t-il une raison pour laquelle la valeur doit être une implémentation spécifique de l'interface List( ArrayListdans ce cas)?

Arrays.asListne renvoie pas a java.util.ArrayList, vous ne pouvez donc pas affecter la valeur de retour de Arrays.asListà une variable de type ArrayList.

Au lieu de:

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

Essaye ça:

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));
Jesper
la source
3
Et plus précisément, cela UnsupportedOperationExceptionest dû au fait que la Arrays.asListméthode renvoie une liste de taille fixe soutenue par un tableau - elle ne peut pas être modifiée. La solution présentée ici par @Jesper évitera cela.
Duncan Jones
191

Cast fonctionne là où l'instance réelle de la liste est un ArrayList. Si c'est, disons, un Vector(qui est une autre extension de List), il lèvera une ClassCastException.

L'erreur lors de la modification de la définition de votre HashMap est due au traitement ultérieur des éléments, et ce processus attend une méthode définie uniquement dans ArrayList. L'exception vous indique qu'il n'a pas trouvé la méthode qu'il recherchait.

Créez un nouveau ArrayListavec le contenu de l'ancien.

new ArrayList<String>(myList);
SJuan76
la source
41

Jetez un œil à ArrayList # addAll (Collection)

Ajoute tous les éléments de la collection spécifiée à la fin de cette liste, dans l'ordre dans lequel ils sont renvoyés par l'itérateur de la collection spécifiée. Le comportement de cette opération n'est pas défini si la collection spécifiée est modifiée pendant que l'opération est en cours. (Cela implique que le comportement de cet appel n'est pas défini si la collection spécifiée est cette liste et que cette liste n'est pas vide.)

Donc, fondamentalement, vous pouvez utiliser

ArrayList<String> listOfStrings = new ArrayList<>(list.size());
listOfStrings.addAll(list);
MadProgrammer
la source
13

Dans Kotlin List peut être converti en ArrayList en le passant en tant que paramètre de constructeur.

ArrayList(list)
Shahab Rauf
la source
5

Arrays.asListne retourne pas d'instance de java.util.ArrayListmais il renvoie une instance de java.util.Arrays.ArrayList.

Vous devrez convertir en ArrayList si vous souhaitez accéder à ArrayListdes informations spécifiques

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));
Amit Deshpande
la source
0

Approche éprouvée.

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

    }
S Krishna
la source