Problema de conversión de List <String> a ArrayList <String>

91

Tengo un método siguiente ... que en realidad toma la lista de oraciones y divide cada oración en palabras. Aquí 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;
}

Tengo que pasar esta lista a un mapa hash en el siguiente formato

HashMap<String, ArrayList<String>>

entonces este método devuelve List y necesito un arrayList? Si intento lanzarlo no funciona ... ¿alguna sugerencia?

Además, si cambio ArrayList a List en un HashMap, obtengo

java.lang.UnsupportedOperationException

debido a esta línea en mi código

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

¿Alguna sugerencia mejor?

Patrón07
fuente

Respuestas:

53

En primer lugar, ¿por qué el mapa es a HashMap<String, ArrayList<String>>y no a HashMap<String, List<String>>? ¿Hay alguna razón por la que el valor debe ser una implementación específica de la interfaz List( ArrayListen este caso)?

Arrays.asListno devuelve a java.util.ArrayList, por lo que no puede asignar el valor devuelto de Arrays.asLista una variable de tipo ArrayList.

En vez de:

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

Prueba esto:

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));
Jesper
fuente
3
Y específicamente, UnsupportedOperationExceptionse debe a que el Arrays.asListmétodo devuelve una lista de tamaño fijo respaldada por una matriz; no se puede modificar. La solución presentada aquí por @Jesper evitará eso.
Duncan Jones
191

Cast funciona donde la instancia real de la lista es un ArrayList. Si es, digamos, una Vector(que es otra extensión de List) lanzará una ClassCastException.

El error al cambiar la definición de su HashMap se debe a que los elementos se procesan posteriormente, y ese proceso espera un método que se define solo en ArrayList. La excepción le dice que no encontró el método que estaba buscando.

Crea uno nuevo ArrayListcon el contenido del anterior.

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

Eche un vistazo a ArrayList # addAll (Colección)

Agrega todos los elementos de la colección especificada al final de esta lista, en el orden en que son devueltos por el Iterador de la colección especificada. El comportamiento de esta operación no está definido si la colección especificada se modifica mientras la operación está en curso. (Esto implica que el comportamiento de esta llamada no está definido si la colección especificada es esta lista y esta lista no está vacía).

Entonces, básicamente, podrías usar

ArrayList<String> listOfStrings = new ArrayList<>(list.size());
listOfStrings.addAll(list);
Programador loco
fuente
13

En Kotlin List se puede convertir en ArrayList pasándolo como un parámetro de constructor.

ArrayList(list)
Shahab Rauf
fuente
5

Arrays.asListno devuelve instancia de java.util.ArrayListpero devuelve instancia de java.util.Arrays.ArrayList.

Deberá convertir a ArrayList si desea acceder a ArrayListinformación específica

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

Enfoque probado y probado.

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
fuente