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?

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+")));

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

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

11

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

ArrayList(list)

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+")));

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;

    }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.