Conversión de matriz a lista en Java

Resuelto Alexandru asked hace 14 años • 25 respuestas

¿Cómo convierto una matriz en una lista en Java?

Utilicé Arrays.asList()pero el comportamiento (y la firma) de alguna manera cambiaron 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[] numbers = new int[] { 1, 2, 3 };
Arrays.asList(numbers)
  • 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 'números'

En muchos casos debería ser fácil de detectar, pero en ocasiones puede pasar desapercibido:

Assert.assertTrue(Arrays.asList(numbers).indexOf(4) == -1);
Alexandru avatar Apr 09 '10 19:04 Alexandru
Aceptado

En su ejemplo, es porque no puede tener una Lista de tipo primitivo. En otras palabras, List<int>no es posible.

Sin embargo, puede utilizar List<Integer>la Integerclase que envuelve la intprimitiva. Convierta su matriz a Listcon el Arrays.asListmétodo de utilidad.

Integer[] numbers = new Integer[] { 1, 2, 3 };
List<Integer> list = Arrays.asList(numbers);

Vea este código ejecutado en vivo en IdeOne.com .

Joe Daley avatar Apr 09 '2010 12:04 Joe Daley

En Java 8, puedes usar transmisiones:

int[] numbers = new int[] { 1, 2, 3 };
Arrays.stream(numbers)
      .boxed()
      .collect(Collectors.toList());
Ibrahim Arief avatar May 16 '2015 23:05 Ibrahim Arief

No podemos tener List<int>un inttipo primitivo así que solo podemos tener List<Integer>.

Java 16

Java 16 introduce un nuevo método en Stream API llamado toList(). Este práctico método devuelve una Lista no modificable que contiene los elementos de la secuencia. Entonces, intentar agregar un nuevo elemento a la lista simplemente conducirá a UnsupportedOperationException.

int[] ints = new int[] {1,2,3,4,5};
Arrays.stream(ints).boxed().toList();

Java 8 (matriz int)

int[] ints = new int[] {1,2,3,4,5};
List<Integer> list11 =Arrays.stream(ints).boxed().collect(Collectors.toList()); 

Java 8 y versiones anteriores (matriz de enteros)

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

¿Necesita ArrayList y no List?

En caso de que queramos una implementación específica de, Listpor ejemplo ArrayList, podemos usar toCollectioncomo:

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

¿ Por qué list21no se puede modificar estructuralmente?

Cuando usamos Arrays.asListel tamaño de la lista devuelta es fijo porque la lista devuelta no es java.util.ArrayList, sino una clase estática privada definida en su interior java.util.Arrays. Entonces, si agregamos o eliminamos elementos de la lista devuelta, UnsupportedOperationExceptionse arrojará un. Entonces deberíamos continuar list22cuando queramos modificar la lista. Si tenemos Java8, también podemos utilizar list23.

Para ser claros, list21se puede modificar en el sentido de que podemos llamar, list21.set(index,element)pero esta lista no se puede modificar estructuralmente, es decir, no se pueden agregar ni eliminar elementos de la lista. También puedes consultar esta respuesta mía para obtener más explicaciones.


Si queremos una lista inmutable, podemos ajustarla como:

List<Integer> list22 = Collections.unmodifiableList(Arrays.asList(integers));

Otro punto a tener en cuenta es que el método Collections.unmodifiableListdevuelve 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 aún es posible realizar cambios en la colección de respaldo y, si se producen, serán 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:

String[] objects = {"Apple", "Ball", "Cat"};
List<String> objectList = List.of(objects);

Java 10 (lista verdaderamente inmutable):

Podemos usar List.oflo introducido en Java 9. También de otras formas:

  1. List.copyOf(Arrays.asList(integers))
  2. Arrays.stream(integers).collect(Collectors.toUnmodifiableList());
akhil_mittal avatar Dec 23 '2015 05:12 akhil_mittal

Hablando de la forma de conversión, depende de por qué necesitas tu archivo List. Si lo necesita solo para leer datos. OK aquí tienes:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

Pero luego, si haces algo como esto:

list.add(1);

usted obtiene java.lang.UnsupportedOperationException. Entonces, en algunos casos incluso necesitas esto:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

El primer enfoque en realidad no convierte la matriz sino que la "representa" como un archivo List. Pero la matriz está bajo el capó con todas sus propiedades, como un número fijo de elementos. Tenga en cuenta que debe especificar el tipo al construir ArrayList.

Roman Nikitchenko avatar Sep 27 '2014 16:09 Roman Nikitchenko