java - poner - Crear una lista mutable de la matriz?
table swing java (5)
Este código simple que utiliza la API de Stream incluida en Java 8 crea una lista mutable (o vista) que contiene los elementos de su matriz:
Foo[] array = ...;
List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));
O, igualmente válido:
List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
Tengo una matriz que me gustaría convertir en una List
para modificar el contenido de la matriz.
Stack Overflow tiene muchas preguntas / respuestas que abordan Arrays.asList()
y cómo solo proporciona una vista de Lista de la matriz subyacente, y cómo intentar manipular la Lista resultante generalmente generará una UnsupportedOperationException
como métodos utilizados para manipular la lista (por ejemplo, add()
, remove()
, etc.) no están implementados por la implementación de Lista provista por Arrays.asList()
.
Pero no puedo encontrar un ejemplo de cómo convertir una matriz en una Lista mutable. Supongo que puedo recorrer la matriz y put()
cada valor en una nueva lista, pero me pregunto si existe una interfaz para hacer esto por mí.
Si está utilizando Eclipse Collections (anteriormente GS Collections ), puede usar FastList.newListWith(...)
o FastList.wrapCopy(...)
.
Ambos métodos toman varargs, por lo que puede crear la matriz en línea o pasar en una matriz existente.
MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4);
Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
La diferencia entre los dos métodos es si la matriz se copia o no. newListWith()
no copia la matriz y, por lo tanto, toma tiempo constante. Debe evitar usarlo si sabe que la matriz podría estar mutada en otro lugar.
Integer[] array2 = {1, 2, 3, 4};
MutableList<Integer> list2 = FastList.newListWith(array2);
array2[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2);
Integer[] array3 = {1, 2, 3, 4};
MutableList<Integer> list3 = FastList.wrapCopy(array3);
array3[1] = 5;
Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);
Nota: Soy un comendador de Eclipse Collections.
Una forma simple:
Foo[] array = ...;
List<Foo> list = new ArrayList<Foo>(Arrays.asList(array));
Eso creará una lista mutable, pero será una copia de la matriz original. Cambiar la lista no cambiará la matriz. Puede volver a copiarlo más tarde, por supuesto, usando toArray
.
Si desea crear una vista mutable en una matriz, creo que tendrá que implementarla usted mismo.
Y si está utilizando API de colección de Google
Lists.newArrayList(myArray)
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));