Lista a ArrayList problema de conversión

3 minutos de lectura

avatar de usuario
patrón07

Tengo el siguiente método… 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 hashmap en el siguiente formato

HashMap<String, ArrayList<String>>

Entonces, ¿este método devuelve List y necesito un ArrayList? Si trato de castear 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?

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

El error al cambiar la definición de tu HashMap se debe a que luego se procesan los elementos, 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.

Crear un nuevo ArrayList con el contenido del anterior.

new ArrayList<String>(myList);

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

Arrays.asList no devuelve un java.util.ArrayListpor lo que no puede asignar el valor de retorno de Arrays.asList a 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+")));

  • Y en concreto el UnsupportedOperationException es causado porque el Arrays.asList El mé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

    30 de octubre de 2012 a las 8:19


avatar de usuario
programador loco

Echa 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 los devuelve 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).

Así que básicamente podrías usar

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

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

ArrayList(list)

avatar de usuario
Amit Deshpande

Arrays.asList no devuelve instancia de java.util.ArrayListpero devuelve una instancia de java.util.Arrays.ArrayList.

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

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

avatar de usuario
s krishna

Enfoque probado y comprobado.

public static ArrayList<String> listToArrayList(List<Object> myList) {
        ArrayList<String> arl = new ArrayList<String>();
        for (Object object : myList) {
            arl.add((String) object);
        }
        return arl;

    }

Esto llega un poco tarde, pero pensé en ponerlo de una manera simple para la respuesta de Convirtiendo Lista a ArrayList.

Manera simple

public static <T> ArrayList<T> listToArrayList(List<T> list) {
    return list != null ? new ArrayList<>(list) : null;
}

Manera clasica

public static  <T> ArrayList<T>  listToArrayList(List<T> list) {
    ArrayList<T> arrayList = new ArrayList<>();
    if (list != null) {
        for (int i = 0; i < list.size(); i++) {
            arrayList.add(list.get(i));
            i++;
        }
        // or simply
        // arrayList.addAll(list);
    }
    return  arrayList;
}

Uso

listToArrayList(yourList);

¿Ha sido útil esta solución?