¿Cómo convierto una matriz en una lista en Java?
Usé el Arrays.asList()
pero el comportamiento (y la firma) de alguna manera cambió de Java SE 1.4.2 (documentos ahora en el archivo) a 8 y la mayoría de los fragmentos que encontré en la web usan el comportamiento 1.4.2.
Por ejemplo:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
- en 1.4.2 devuelve una lista que contiene los elementos 1, 2, 3
- en 1.5.0+ devuelve una lista que contiene la matriz de spam
En muchos casos, debería ser fácil de detectar, pero a veces puede pasar desapercibido:
Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
java
arrays
list
data-conversion
Alexandru
fuente
fuente
Arrays.asList(new int[] { 1, 2, 3 })
:; definitivamente no compiló en Java 1.4.2, porque un noint[]
es un .Object[]
Arrays.asList
debería funcionar.Respuestas:
En su ejemplo, es porque no puede tener una Lista de un tipo primitivo. En otras palabras,
List<int>
no es posible.Sin embargo, puede
List<Integer>
usar laInteger
clase que envuelve laint
primitiva. Convierta su matriz a aList
con elArrays.asList
método de utilidad.Vea este código en vivo en IdeOne.com .
fuente
List<Integer[]>
?Integer[] integerArray1 = { 1 }; Integer[] integerArray2 = { 2 }; List<Integer[]> integerArrays = Arrays.asList(integerArray1, integerArray2);
En Java 8, puede usar transmisiones:
fuente
boolean[]
. Supongo que es porque es igual de fácil hacer unBoolean[]
. Esa es probablemente una mejor solución. De todos modos, es una peculiaridad interesante.Hablando sobre la forma de conversión, depende de por qué necesita su
List
. Si lo necesita solo para leer datos. OK aquí tienes:Pero luego, si haces algo como esto:
se obtiene
java.lang.UnsupportedOperationException
. Entonces, en algunos casos, incluso necesitas esto:El primer enfoque en realidad no convierte la matriz, sino que la 'representa' como a
List
. Pero la matriz está bajo el capó con todas sus propiedades, como un número fijo de elementos. Tenga en cuenta que necesita especificar el tipo al construirArrayList
.fuente
El problema es que los varargs se introdujeron en Java5 y, desafortunadamente, también
Arrays.asList()
se sobrecargaron con una versión vararg. AsíArrays.asList(spam)
lo entiende el compilador Java5 como un parámetro vararg de matrices intEste problema se explica con más detalles en Effective Java 2nd Ed., Capítulo 7, Elemento 42.
fuente
Parece un poco tarde, pero aquí están mis dos centavos. No podemos tener
List<int>
comoint
es un tipo primitivo, por lo que solo podemos tenerList<Integer>
.Java 8 (int array)
Java 8 y menos (matriz entera)
¿Necesita ArrayList y no List?
En caso de que queramos una implementación específica de,
List
por ejemploArrayList
, podemos usartoCollection
como:¿Por qué
list21
no se puede modificar estructuralmente?Cuando usamos
Arrays.asList
el tamaño de la lista devuelta es fijo porque la lista devuelta no lo esjava.util.ArrayList
, sino una clase estática privada definida en su interiorjava.util.Arrays
. Entonces, si agregamos o eliminamos elementos de la lista devuelta, seUnsupportedOperationException
arrojará un . Entonces deberíamos irlist22
cuando queramos modificar la lista. Si tenemos Java8, entonces también podemos ir conlist23
.Para que quede claro,
list21
puede modificarse en el sentido de que podemos llamar,list21.set(index,element)
pero esta lista puede no modificarse estructuralmente, es decir, no puede agregar o eliminar elementos de la lista. También puedes consultar esta pregunta .Si queremos una lista inmutable, podemos envolverla como:
Otro punto a tener en cuenta es que el método
Collections.unmodifiableList
devuelve una vista no modificable de la lista especificada. Una colección de vistas no modificables es una colección que no se puede modificar y también es una vista de una colección de respaldo. Tenga en cuenta que los cambios en la colección de respaldo aún podrían ser posibles, y si ocurren, son visibles a través de la vista no modificable.Podemos tener una lista verdaderamente inmutable en Java 9 y 10.
Lista verdaderamente inmutable
Java 9:
Java 10 (lista verdaderamente inmutable) de dos maneras:
List.copyOf(Arrays.asList(integers))
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
También revise esta respuesta mía para más.
fuente
List::add
yList::remove
falla con una lista devuelta porArrays.asList
. El JavaDoc para ese método está mal escrito y no está claro en este punto. En mi tercera lectura, supongo que la frase "tamaño fijo" estaba destinada a decir que uno no puede agregar o eliminar elementos.Aún más corto:
fuente
Recientemente tuve que convertir una matriz en una Lista. Más tarde, el programa filtró la lista intentando eliminar los datos. Cuando utiliza la función Arrays.asList (matriz), crea una colección de tamaño fijo: no puede agregar ni eliminar. Esta entrada explica el problema mejor de lo que puedo: ¿Por qué obtengo una UnsupportedOperationException cuando intento eliminar un elemento de una Lista? .
Al final, tuve que hacer una conversión "manual":
Supongo que podría haber agregado la conversión de una matriz a una lista utilizando una operación List.addAll (elementos).
fuente
new ArrayList<ListItem>(Arrays.asList(itemsArray))
haría lo mismoCollections.addAll(items, itemsArray)
lugar , úselos.Usar matrices
Esta es la forma más simple de convertir una matriz
List
. Sin embargo, si intenta agregar un nuevo elemento o eliminar un elemento existente de la lista, seUnsupportedOperationException
generará un .Uso de ArrayList u otras implementaciones de listas
Puede usar un
for
bucle para agregar todos los elementos de la matriz a unaList
implementación, por ejemploArrayList
:Usando Stream API en Java 8
Puede convertir la matriz en una secuencia y luego recopilarla utilizando diferentes recopiladores: el recopilador predeterminado en Java 8 se usa
ArrayList
detrás de la pantalla, pero también puede imponer su implementación preferida.Ver también:
fuente
Otra solución alternativa si usa apache commons-lang:
Donde ArrayUtils.toObject convierte
int[]
aInteger[]
fuente
tienes que echar en matriz
fuente
Un trazador de líneas:
fuente
En Java 9 tiene la solución aún más elegante de usar listas inmutables a través del nuevo método práctico de fábrica
List.of
:(descaradamente copiado de aquí )
fuente
Si está apuntando a Java 8 (o posterior), puede intentar esto:
NOTA:
Presta atención al
Collectors.<Integer>toList()
, este método genérico te ayuda a evitar el error "No coinciden los tipos: no se puede convertir deList<Object>
aList<Integer>
".fuente
Usando guayaba:
Usando las colecciones de Apache Commons:
fuente
Si esto ayuda: he tenido el mismo problema y simplemente escribí una función genérica que toma una matriz y devuelve una ArrayList del mismo tipo con el mismo contenido:
fuente
Matriz dada:
Conversión de matriz entera a Lista entera
Una forma: boxed () -> devuelve IntStream
Segunda forma: mapear cada elemento de la secuencia a Integer y luego recopilar
NOTA: Usando mapToObj puede convertir cada elemento int en secuencia de cadena, secuencia de caracteres, etc., colocando i en (char) i
Conversión de un tipo de matriz a otro tipo Ejemplo:
fuente
Por lo tanto, depende de la versión de Java que esté intentando.
Java 7
O
O
En Java 8
Referencia : http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/
fuente
¿Puede mejorar esta respuesta, por favor? Esto es lo que uso, pero no estoy 100% claro. Funciona bien pero intelliJ agregó una nueva WeatherStation [0]. ¿Por qué el 0?
fuente
use dos líneas de código para convertir la matriz a la lista si la usa en un valor entero, debe usar el tipo de autoboxing para el tipo de datos primitivo
fuente