Wyświetl problem z konwersją <String> do ArrayList <String>

91

Mam następującą metodę ... która faktycznie pobiera listę zdań i dzieli każde zdanie na słowa. Tutaj jest to:

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

Muszę przekazać tę listę do hashmap w następującym formacie

HashMap<String, ArrayList<String>>

więc ta metoda zwraca List i potrzebuję arrayList? Jeśli spróbuję rzucić to nie działa ... jakieś sugestie?

Ponadto, jeśli zmienię ArrayList na List w HashMap, otrzymam

java.lang.UnsupportedOperationException

z powodu tej linii w moim kodzie

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

Jakieś lepsze sugestie?

Skipper07
źródło

Odpowiedzi:

53

Po pierwsze, dlaczego mapa jest a, HashMap<String, ArrayList<String>>a nie a HashMap<String, List<String>>? Czy jest jakiś powód, dla którego wartością musi być konkretna implementacja interfejsu List( ArrayListw tym przypadku)?

Arrays.asListnie zwraca a java.util.ArrayList, więc nie możesz przypisać wartości zwracanej Arrays.asListdo zmiennej typu ArrayList.

Zamiast:

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

Spróbuj tego:

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));
Jesper
źródło
3
A konkretnie UnsupportedOperationExceptionjest to spowodowane tym, że Arrays.asListmetoda zwraca listę o stałym rozmiarze popartą tablicą - nie można jej zmodyfikować. Rozwiązanie przedstawione tutaj przez @Jesper pozwoli tego uniknąć.
Duncan Jones
191

Przesyłanie działa, gdy rzeczywistą instancją listy jest plik ArrayList. Jeśli jest, powiedzmy, a Vector(co jest kolejnym rozszerzeniem List), zgłosi ClassCastException.

Błąd podczas zmiany definicji HashMap jest spowodowany późniejszymi przetwarzanymi elementami, a ten proces oczekuje metody zdefiniowanej tylko w ArrayList. Wyjątek informuje, że nie znalazł metody, której szukał.

Utwórz nowy ArrayListz zawartością starego.

new ArrayList<String>(myList);
SJuan76
źródło
41

Spójrz na ArrayList # addAll (Collection)

Dołącza wszystkie elementy w określonej kolekcji na końcu tej listy, w kolejności, w jakiej są zwracane przez Iterator określonej kolekcji. Zachowanie tej operacji jest niezdefiniowane, jeśli określona kolekcja zostanie zmodyfikowana w trakcie trwania operacji. (Oznacza to, że zachowanie tego wywołania jest nieokreślone, jeśli określona kolekcja jest tą listą, a ta lista jest niepusta).

Więc w zasadzie możesz użyć

ArrayList<String> listOfStrings = new ArrayList<>(list.size());
listOfStrings.addAll(list);
MadProgrammer
źródło
13

W Kotlin List można przekonwertować na ArrayList poprzez przekazanie jej jako parametru konstruktora.

ArrayList(list)
Shahab Rauf
źródło
5

Arrays.asListnie zwraca wystąpienia, java.util.ArrayListale zwraca wystąpienie java.util.Arrays.ArrayList.

Jeśli chcesz uzyskać dostęp do ArrayListokreślonych informacji, musisz przekonwertować je na ArrayList

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));
Amit Deshpande
źródło
0

Wypróbowane i sprawdzone podejście.

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
źródło