La conversión de serie a la lista en Java
-
25-09-2019 - |
Pregunta
¿Cómo se convierte una matriz a una lista en Java?
He utilizado el Arrays.asList()
pero el comportamiento (y firma) de alguna manera cambiado de Java SE 1.4.2 (docs ahora en el archivo) a 8 y la mayoría de los fragmentos que he encontrado en el uso de la web el comportamiento 1.4.2.
Por ejemplo:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
- en 1.4.2 Devuelve una lista con los elementos 1, 2, 3
- en 1.5.0+ devuelve una lista que contiene el correo no deseado array
En muchos casos, debería ser fácil de detectar, pero a veces puede deslizarse inadvertida:
Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);
Solución
En el ejemplo, es porque no se puede tener una lista de un tipo primitivo. En otras palabras, List<int>
no es posible.
Puede, sin embargo, tener un List<Integer>
utilizando el Integer
clase que envuelve el int
primitiva. Convertir su matriz a un List
con el Arrays.asList
método de utilidad.
Integer[] spam = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(spam);
Otros consejos
En Java 8, puede utilizar secuencias:
int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
.boxed()
.collect(Collectors.toList());
Hablando de manera conversión, que depende de la razón por qué necesita su List
.
Si lo necesita sólo para leer datos. OK, aquí van:
Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);
Pero si haces algo como esto:
list.add(1);
se obtiene java.lang.UnsupportedOperationException
.
Así que para algunos casos incluso se necesita lo siguiente:
Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));
En primer enfoque realidad no convierte matriz, pero 'representa' como si fuera un List
. Pero matriz es bajo el capó con todas sus propiedades, como el número fijo de elementos. Tenga en cuenta que es necesario especificar el tipo en la construcción de ArrayList
.
El problema es que varargs consiguieron introducirse en Java5 y por desgracia, Arrays.asList()
consiguieron sobrecargados con una versión vararg también. Así Arrays.asList(spam)
se entiende por el compilador Java5 como un parámetro vararg de arrays Int.
Este problema se explica con más detalles en efectivo Java 2ª Ed., Capítulo 7, artículo 42.
Parece poco tarde pero aquí están mis dos centavos. No podemos tener List<int>
como int
es un tipo primitivo por lo que sólo podemos tener List<Integer>
.
Java 8 (int array)
int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList());
Java 8 y por debajo (array entero)
Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 = Arrays.asList(integers); // returns a fixed-size list backed by the specified array.
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8 only
Necesidad ArrayList y no lista?
En caso de que quieran una implementación específica del List
por ejemplo, ArrayList
entonces podemos utilizar toCollection
como:
ArrayList<Integer> list24 = Arrays.stream(integers)
.collect(Collectors.toCollection(ArrayList::new));
¿Por qué list21
no puede ser modificado estructuralmente?
Cuando usamos Arrays.asList
el tamaño de la lista devuelta es fijo porque la lista devuelta no es java.util.ArrayList
, pero una clase estática privada definida en el interior java.util.Arrays
. Así que si añadir o eliminar elementos de la lista devuelta, se lanzará una UnsupportedOperationException
. Así que hay que ir con list22
cuando queremos modificar la lista. Si tenemos Java8 entonces también podemos ir con list23
.
Para ser list21
claro puede ser modificado en el sentido de que podemos llamar list21.set(index,element)
pero esta lista no puede ser modificado estructuralmente es decir, no se puede añadir o elementos de eliminar de la lista. También puede comprobar esto pregunta .
Si queremos una lista inmutable entonces podemos envolverlo como:
List<Integer> list 22 = Collections.unmodifiableList(Arrays.asList(integers));
Otro punto a señalar es que la Collections.unmodifiableList
método devuelve una vista no modificable de la lista especificada. Una colección vista inmodificable es una colección que es modificable y es también una vista en una colección de respaldo. Nótese que los cambios a la colección respaldo aún podría ser posible, y si se producen, que son visibles a través de la vista no se puede modificar.
puede tener una lista verdaderamente inmutable en Java 10.
Java 10 (lista de verdad inmutable) de dos maneras:
-
List.copyOf(Arrays.asList(integers))
-
Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
Recientemente tuve para convertir una matriz a una lista. Más tarde en el programa de filtrado la lista de intentar extraer los datos. Cuando se utiliza la función Arrays.asList (matriz), se crea una colección de tamaño fijo: usted no puede añadir ni eliminar. Esta entrada se explica el problema mejor que puedo: ¿Por qué aparece una UnsupportedOperationException cuando se trata de eliminar un elemento de una lista? .
Al final, que tenía que hacer una conversión "manual":
List<ListItem> items = new ArrayList<ListItem>();
for (ListItem item: itemsArray) {
items.add(item);
}
I supongamos que podría haber añadido la conversión de una matriz a una lista que utiliza una (artículos) operación List.addAll.
Incluso más corto:
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Utilizar matrices
Esta es la forma más sencilla para convertir una matriz para List
. Sin embargo, si se intenta añadir un nuevo elemento o eliminar un elemento existente de la lista, se lanzará una UnsupportedOperationException
.
Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);
// WARNING:
list2.add(1); // Unsupported operation!
list2.remove(1); // Unsupported operation!
Uso de ArrayList o en otra lista Implementaciones
Se puede utilizar un bucle for
añadir todos los elementos de la matriz en una implementación List
, por ejemplo ArrayList
:
List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
list.add(i);
}
Uso de la API de corriente en Java 8
Se puede convertir la matriz en una corriente, a continuación, recoger el flujo usando diferentes colectores:. El colector por defecto en Java 8 utilización ArrayList
detrás de la pantalla, pero también se puede imponer su implementación preferida
List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));
Ver también:
Otra solución si se utiliza Apache Commons-Lang:
int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(ArrayUtils.toObject(spam));
Donde ArrayUtils.toObject conversos int[]
a Integer[]
Si el idioma de Java 8 (o posterior), puede intentar lo siguiente:
int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
.boxed().collect(Collectors.<Integer>toList());
Nota:
Tenga en cuenta el Collectors.<Integer>toList()
, este método genérico le ayuda a evitar el error "No coinciden los tipos: no se puede convertir de List<Object>
a List<Integer>
".
tiene que echaban a array
Arrays.asList((Object[]) array)
One-liner:
List<Integer> list = Arrays.asList(new Integer[] {1, 2, 3, 4});
-
El uso de guayaba:
Integer[] array = { 1, 2, 3}; List<Integer> list = Lists.newArrayList(sourceArray);
-
El uso de Apache Commons Colecciones:
Integer[] array = { 1, 2, 3}; List<Integer> list = new ArrayList<>(6); CollectionUtils.addAll(list, array);
Por lo tanto, depende de la versión de Java que está intentando -
Java 7
Arrays.asList(1, 2, 3);
o
final String arr[] = new String[] { "G", "E", "E", "K" };
final List<String> initialList = new ArrayList<String>() {{
add("C");
add("O");
add("D");
add("I");
add("N");
}};
// Elements of the array are appended at the end
Collections.addAll(initialList, arr);
o
Integer[] arr = new Integer[] { 1, 2, 3 };
Arrays.asList(arr);
En Java 8
int[] num = new int[] {1, 2, 3};
List<Integer> list = Arrays.stream(num)
.boxed().collect(Collectors.<Integer>toList())
referencia - http://www.codingeek.com/java/how-to-convert-array-to-list-in-java/
Si esto ayuda: He tenido el mismo problema y simplemente escribí una función genérica que toma una matriz y devuelve un ArrayList del mismo tipo con el mismo contenido:
public static <T> ArrayList<T> ArrayToArrayList(T[] array) {
ArrayList<T> list = new ArrayList<T>();
for(T elmt : array) list.add(elmt);
return list;
}
Array Dado:
int[] givenArray = {2,2,3,3,4,5};
conversión de matriz de enteros a lista de números enteros
Una manera: en caja () -> devuelve el IntStream
List<Integer> givenIntArray1 = Arrays.stream(givenArray)
.boxed()
.collect(Collectors.toList());
segunda manera: Mapa de cada elemento de la corriente a entero y luego recoger
Nota: Uso mapToObj puede encubierta cada elemento int en la corriente de cuerdas, etc corriente de carbón por la carcasa i a (char) i
List<Integer> givenIntArray2 = Arrays.stream(givenArray)
.mapToObj(i->i)
.collect(Collectors.toList());
conversión de un tipo de matriz con otro ejemplo Tipo:
List<Character> givenIntArray2 = Arrays.stream(givenArray)
.mapToObj(i->(char)i)
.collect(Collectors.toList());
utilizar dos líneas de código para convertir matriz a la lista si lo usa en valor entero debe utilizar el tipo autoboxing para el tipo de datos primitivo
Integer [] arr={1,2};
Arrays.asList(arr);