Problema de conversão List <String> para ArrayList <String>

89

Eu tenho um método a seguir ... que na verdade pega a lista de frases e divide cada frase em palavras. Aqui está:

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

Eu tenho que passar esta lista em um hashmap no seguinte formato

HashMap<String, ArrayList<String>>

portanto, este método retorna List e eu preciso de um arrayList? Se eu tentar lançar não funciona ... alguma sugestão?

Além disso, se eu alterar ArrayList para List em um HashMap, recebo

java.lang.UnsupportedOperationException

por causa desta linha no meu código

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

Alguma sugestão melhor?

Skipper07
fonte

Respostas:

52

Em primeiro lugar, por que o mapa é a HashMap<String, ArrayList<String>>e não a HashMap<String, List<String>>? Existe algum motivo pelo qual o valor deve ser uma implementação específica da interface List( ArrayListneste caso)?

Arrays.asListnão retorna a java.util.ArrayList, portanto, você não pode atribuir o valor de retorno de Arrays.asLista uma variável do tipo ArrayList.

Ao invés de:

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

Experimente isto:

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));
Jesper
fonte
3
E, especificamente, o UnsupportedOperationExceptioné causado porque o Arrays.asListmétodo retorna uma lista de tamanho fixo apoiada por uma matriz - ela não pode ser modificada. A solução apresentada aqui por @Jesper evitará isso.
Duncan Jones
189

Cast funciona onde a instância real da lista é um ArrayList. Se for, digamos, um Vector(que é outra extensão de List), ele lançará uma ClassCastException.

O erro ao alterar a definição de seu HashMap deve-se aos elementos que estão sendo processados ​​posteriormente, e esse processo espera um método que é definido apenas em ArrayList. A exceção informa que ele não encontrou o método que procurava.

Crie um novo ArrayListcom o conteúdo do antigo.

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

Dê uma olhada em ArrayList # addAll (Collection)

Anexa todos os elementos da coleção especificada ao final desta lista, na ordem em que são retornados pelo Iterator da coleção especificada. O comportamento desta operação é indefinido se a coleção especificada for modificada enquanto a operação estiver em andamento. (Isso implica que o comportamento desta chamada é indefinido se a coleção especificada for esta lista e esta lista não estiver vazia.)

Basicamente, você pode usar

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

Em Kotlin, a lista pode ser convertida em ArrayList passando-a como um parâmetro do construtor.

ArrayList(list)
Shahab Rauf
fonte
5

Arrays.asListnão retorna instância de, java.util.ArrayListmas retorna instância de java.util.Arrays.ArrayList.

Você precisará converter para ArrayList se quiser acessar ArrayListinformações específicas

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

Abordagem experimentada e testada.

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
fonte