Listen Sie das Konvertierungsproblem <String> in ArrayList <String> auf

88

Ich habe eine folgende Methode ... die tatsächlich die Liste der Sätze nimmt und jeden Satz in Wörter aufteilt. Hier ist es:

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

Ich muss diese Liste in einer Hashmap in einem folgenden Format übergeben

HashMap<String, ArrayList<String>>

Also gibt diese Methode List zurück und ich brauche eine ArrayList? Wenn ich versuche zu wirken, funktioniert es nicht ... irgendwelche Vorschläge?

Wenn ich die ArrayList in einer HashMap in List ändere, wird Folgendes angezeigt:

java.lang.UnsupportedOperationException

wegen dieser Zeile in meinem Code

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

Irgendwelche besseren Vorschläge?

Skipper07
quelle

Antworten:

52

Zuallererst, warum ist die Karte a HashMap<String, ArrayList<String>>und nicht a HashMap<String, List<String>>? Gibt es einen Grund, warum der Wert eine bestimmte Implementierung der Schnittstelle sein muss List( ArrayListin diesem Fall)?

Arrays.asListgibt a nicht zurück java.util.ArrayList, daher können Sie den Rückgabewert von nicht Arrays.asListeiner Variablen vom Typ zuweisen ArrayList.

Anstatt:

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

Versuche dies:

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));
Jesper
quelle
3
Dies wird insbesondere UnsupportedOperationExceptiondadurch verursacht, dass die Arrays.asListMethode eine Liste mit fester Größe zurückgibt, die von einem Array unterstützt wird - sie kann nicht geändert werden. Die hier von @Jesper vorgestellte Lösung wird dies vermeiden.
Duncan Jones
187

Cast funktioniert dort, wo die eigentliche Instanz der Liste eine ist ArrayList. Wenn es sich beispielsweise um eine Vector(eine weitere Erweiterung von List) handelt, wird eine ClassCastException ausgelöst.

Der Fehler beim Ändern der Definition Ihrer HashMap ist darauf zurückzuführen, dass die Elemente später verarbeitet werden. Dieser Prozess erwartet eine Methode, die nur in definiert ist ArrayList. Die Ausnahme besagt, dass die gesuchte Methode nicht gefunden wurde.

Erstellen Sie eine neue ArrayListmit dem Inhalt der alten.

new ArrayList<String>(myList);
SJuan76
quelle
41

Schauen Sie sich ArrayList # addAll (Collection) an.

Hängt alle Elemente in der angegebenen Sammlung an das Ende dieser Liste in der Reihenfolge an, in der sie vom Iterator der angegebenen Sammlung zurückgegeben werden. Das Verhalten dieser Operation ist undefiniert, wenn die angegebene Sammlung während der Operation geändert wird. (Dies bedeutet, dass das Verhalten dieses Aufrufs undefiniert ist, wenn die angegebene Auflistung diese Liste ist und diese Liste nicht leer ist.)

Also im Grunde könnte man verwenden

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

In Kotlin kann List in ArrayList konvertiert werden, indem sie als Konstruktorparameter übergeben wird.

ArrayList(list)
Shahab Rauf
quelle
5

Arrays.asListgibt keine Instanz von zurück, java.util.ArrayListaber es gibt eine Instanz von zurück java.util.Arrays.ArrayList.

Sie müssen in ArrayList konvertieren, wenn Sie auf ArrayListbestimmte Informationen zugreifen möchten

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

Bewährter Ansatz.

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
quelle