Tengo una matriz que se inicializa como:
Element[] array = {new Element(1), new Element(2), new Element(3)};
Me gustaría convertir esta matriz en un objeto de la ArrayList
clase.
ArrayList<Element> arraylist = ???;
java
arrays
arraylist
type-conversion
Ron Tuffin
fuente
fuente
ArrayList
. El cartel pidió específicamente eso.Respuestas:
fuente
new ArrayList
llamada también es innecesaria.List<ClassName> list = Arrays.asList(array)
Arrays.asList(array)
sin pasarlo a un nuevoArrayList
objeto arreglará el tamaño de la lista. Una de las razones más comunes para usar unArrayList
es poder cambiar dinámicamente su tamaño, y su sugerencia lo evitaría.Dado:
La respuesta más simple es hacer:
Esto funcionará bien. Pero algunas advertencias:
ArrayList
. De lo contrario obtendrás unUnsupportedOperationException
.asList()
está respaldada por la matriz original. Si modifica la matriz original, la lista también se modificará. Esto puede ser sorprendente.fuente
java.util.ArrayList
. Arrays.asList en realidad devuelve unjava.util.Arrays.ArrayList
que no esinstanceof
la otra clase. Entonces, una tercera advertencia es que si intenta usarlo en un contexto que requiere lo anterior, no funcionará.(hilo antiguo, pero solo 2 centavos ya que ninguno menciona Guava u otras libs y algunos otros detalles)
Si puedes, usa guayaba
Vale la pena señalar la forma de la guayaba, que simplifica enormemente estas travesuras:
Uso
Para una lista inmutable
Usar la
ImmutableList
clase y susof()
ycopyOf()
fábrica métodos (elementos no puede ser nulo) :Para una lista mutable
Use la
Lists
clase y susnewArrayList()
métodos de fábrica:Tenga en cuenta también los métodos similares para otras estructuras de datos en otras clases, por ejemplo en
Sets
.¿Por qué guayaba?
La atracción principal podría ser reducir el desorden debido a los genéricos para la seguridad de tipos, ya que el uso de los métodos de la fábrica de guayaba permite inferir los tipos la mayor parte del tiempo. Sin embargo, este argumento tiene menos agua desde que Java 7 llegó con el nuevo operador de diamantes.
Pero no es la única razón (y Java 7 aún no está en todas partes): la sintaxis abreviada también es muy útil, y los inicializadores de métodos, como se ve arriba, permiten escribir código más expresivo. Lo haces en una llamada de guayaba lo que toma 2 con las colecciones de Java actuales.
Si no puedes ...
Para una lista inmutable
Utilice la
Arrays
clase de JDK y suasList()
método de fábrica, envuelto con unCollections.unmodifiableList()
:Tenga en cuenta que el tipo devuelto para
asList()
unList
uso de una concretaArrayList
aplicación, pero que no esjava.util.ArrayList
. Es un tipo interno, que emula,ArrayList
pero en realidad hace referencia directa a la matriz pasada y la hace "escribir" (las modificaciones se reflejan en la matriz).Prohíbe modificaciones a través de algunos de los
List
métodos de la API simplemente extendiendo unAbstractList
(por lo tanto, agregar o eliminar elementos no es compatible), sin embargo, permite que las llamadasset()
anulen elementos. Por lo tanto, esta lista no es realmente inmutable yasList()
debe incluirse un llamado aCollections.unmodifiableList()
.Vea el siguiente paso si necesita una lista mutable.
Para una lista mutable
Igual que el anterior, pero envuelto con un real
java.util.ArrayList
:Para fines educativos: la buena manera manual
fuente
List
devuelto porArrays.asList
es mutable, ya que aún puedeset
elementos, simplemente no es redimensionable. Para listas inmutables sin guayaba, puede mencionarCollections.unmodifiableList
.arrayToList
para Java 1.5+ es incorrecto. Usted está instanciando listas deString
, y tratando de recuperar cadenas de la matriz dada, en lugar de utilizar el tipo de parámetro genérico,T
. Aparte de eso, buena respuesta, y +1 por ser el único, incluida la forma manual.O(1)
, pero para la inmutabilidad, debe hacer una copia, por ejemplo, porCollections.unmodifiableList(new ArrayList<>(Arrays.asList(array)))
.Como esta pregunta es bastante antigua, me sorprende que nadie haya sugerido la forma más simple todavía:
A partir de Java 5,
Arrays.asList()
toma un parámetro varargs y no tiene que construir la matriz explícitamente.fuente
List<String> a = Arrays.asList("first","second","third")
Asegúrese de que
myArray
sea del mismo tipo queT
. Obtendrá un error de compilación si intenta crear un archivo aList<Integer>
partir de una matriz deint
, por ejemplo.fuente
Otra forma (aunque esencialmente equivalente a la
new ArrayList(Arrays.asList(array))
solución en cuanto a rendimiento:fuente
Java 9
En Java 9 , puede usar
List.of
el método de fábrica estático para crear unList
literal. Algo como lo siguiente:Esto devolvería una lista inmutable que contiene tres elementos. Si quieres una lista mutable , pasa esa lista al
ArrayList
constructor:JEP 269: Métodos convenientes de fábrica para colecciones
JEP 269 proporciona algunos métodos de fábrica convenientes para Java Collections API. Estos métodos de fábrica estáticas e inmutables están integrados en los
List
,Set
yMap
las interfaces en Java 9 y posterior.fuente
Probablemente solo necesite una Lista, no una ArrayList. En ese caso, solo puedes hacer:
fuente
set
método), no puede cambiar el tamaño de la lista (noadd
oremove
elementos)!Otra actualización, casi terminando el año 2014, también puede hacerlo con Java 8:
Se guardarían algunos caracteres, si esto pudiera ser solo un
List
fuente
Collectors.toList()
realidad devuelve unArrayList
.Si utiliza :
¡ puedes crear y llenar dos listas! Llenar dos veces una lista grande es exactamente lo que no desea hacer, ya que creará otra
Object[]
matriz cada vez que deba ampliarse la capacidad.Afortunadamente, la implementación de JDK es rápida y
Arrays.asList(a[])
está muy bien hecha. Crea una especie de ArrayList llamada Arrays.ArrayList donde los datos del Objeto [] apuntan directamente a la matriz.¡El lado peligroso es que si cambia la matriz inicial, cambia la Lista! ¿Estás seguro de que quieres eso? Tal vez si tal vez no.
Si no, la forma más comprensible es hacer esto:
O como dijo @glglgl, puede crear otra ArrayList independiente con:
Me encanta usar
Collections
,Arrays
o guayaba. Pero si no encaja, o no lo siente, simplemente escriba otra línea poco elegante.fuente
new ArrayList<T>(Arrays.asList(myArray));
parte que desalienta usar. Ambos hacen lo mismo y tienen la misma complejidad.new ArrayList<T>(Arrays.asList(myArray));
hace lo mismo, copia elasList
a unArrayList
...En
Java 9
puedes usar:fuente
De acuerdo con la pregunta, la respuesta con Java 1.7 es:
Sin embargo, es mejor usar siempre la interfaz:
fuente
fuente
Puedes convertir usando diferentes métodos
List<Element> list = Arrays.asList(array);
List<Element> list = new ArrayList();
Collections.addAll(list, array);
Arraylist list = new Arraylist();
list.addAll(Arrays.asList(array));
Para obtener más detalles, puede consultar http://javarevisited.blogspot.in/2011/06/converting-array-to-arraylist-in-java.html
fuente
como todos dijeron, esto lo hará
y la nueva forma común de crear una matriz es observableArrays
ObservableList: una lista que permite a los oyentes rastrear los cambios cuando ocurren.
para Java SE puedes probar
eso es de acuerdo con Oracle Docs
Actualizar Java 9
También en Java 9 es un poco fácil:
fuente
Desde Java 8 hay una manera más fácil de transformar:
fuente
También puedes hacerlo con stream en Java 8.
fuente
Collectors.toList()
devolverá unArrayList
. Sin embargo, esto puede diferir en futuras versiones en Java. Si desea un tipo específico de colección, utiliceCollectors.toCollection()
en su lugar donde puede especificar qué tipo exacto de colección desea crear.Si vemos la definición de
Arrays.asList()
método, obtendrá algo como esto:Entonces, puede inicializar
arraylist
así:Puede haber otra respuesta para esta pregunta también.
Si ve una declaración para el
java.util.Collections.addAll()
método, obtendrá algo como esto:Entonces, este código también es útil para hacerlo
fuente
Otra forma simple es agregar todos los elementos de la matriz a una nueva ArrayList usando un ciclo for-each.
fuente
Si la matriz es de un tipo primitivo, las respuestas dadas no funcionarán. Pero desde Java 8 puedes usar:
fuente
char
array.Puedes hacerlo en Java 8 de la siguiente manera
fuente
ArrayList<String> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
Podemos convertir fácilmente una matriz a
ArrayList
. Usamos eladdAll()
método de la interfaz de Colección con el propósito de copiar contenido de una lista a otra.fuente
ArrayList
los constructores acepta un? extends Collection<T>
argumento, haciendo que la llamada seaaddAll
redundante.Aunque hay muchas respuestas perfectamente escritas a esta pregunta, agregaré mis entradas.
Di que tienes
Element[] array = { new Element(1), new Element(2), new Element(3) };
Nueva ArrayList se puede crear de las siguientes maneras
Y son muy compatibles con todas las operaciones de ArrayList
Pero las siguientes operaciones devuelven solo una vista de Lista de una ArrayList y no una ArrayList real.
Por lo tanto, darán error al intentar realizar algunas operaciones de ArrayList
Más sobre la representación de la lista de enlaces de matriz .
fuente
La forma más sencilla de hacerlo es agregando el siguiente código. Tratado y probado.
fuente
La salida es ...
Hola
mundo
fuente
Use el siguiente código para convertir una matriz de elementos en una ArrayList.
fuente
Ya todos han proporcionado suficiente respuesta buena para su problema. Ahora, de todas las sugerencias, debe decidir cuál se adaptará a sus necesidades. Hay dos tipos de colección que necesita saber. Una es una colección no modificada y otra colección que le permitirá modificar el objeto más adelante.
Entonces, aquí daré un breve ejemplo para dos casos de uso.
Creación de colección inmutable :: Cuando no desea modificar el objeto de colección después de la creación
List<Element> elementList = Arrays.asList(array)
Creación de colección mutable :: Cuando desee modificar el objeto de colección creado después de la creación.
List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));
fuente
List
devuelveArrays.asList
es solo un contenedor sobre la matriz original y permite acceder y modificar elementos individuales a través deget
yset
. Probablemente debería aclarar que quiere decir "no agregar o quitar elementos" en lugar de "inmutable", lo que significa no cambiar en absoluto.Matriz de objeto dada:
Convertir matriz a lista:
Convertir matriz a ArrayList
Convertir matriz a LinkedList
Lista de impresión:
SALIDA
1
2
3
fuente
La clase Arrays de Java 8 proporciona un método stream () que tiene versiones sobrecargadas que aceptan tanto matrices primitivas como matrices de objetos.
fuente
El siguiente código parece una buena manera de hacer esto.
fuente