¿Cómo convertir una ArrayList que contiene números enteros en una matriz int primitiva?
-
23-08-2019 - |
Pregunta
Estoy intentando convertir un ArrayList que contiene objetos Integer a int[] primitivo con el siguiente código, pero arroja un error de tiempo de compilación.¿Es posible convertir en Java?
List<Integer> x = new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
Solución
Puede convertir, pero no creo que haya nada construido en hacerlo automáticamente:
public static int[] convertIntegers(List<Integer> integers)
{
int[] ret = new int[integers.size()];
for (int i=0; i < ret.length; i++)
{
ret[i] = integers.get(i).intValue();
}
return ret;
}
(Tenga en cuenta que esto será lanzar una NullPointerException si bien integers
o cualquier elemento dentro de ella es null
.)
EDIT: De acuerdo con los comentarios, es posible que desee utilizar el iterador de la lista para evitar costos desagradables con las listas como LinkedList
:
public static int[] convertIntegers(List<Integer> integers)
{
int[] ret = new int[integers.size()];
Iterator<Integer> iterator = integers.iterator();
for (int i = 0; i < ret.length; i++)
{
ret[i] = iterator.next().intValue();
}
return ret;
}
Otros consejos
Si estas usando java-8 También hay otra manera de hacer esto.
int[] arr = list.stream().mapToInt(i -> i).toArray();
Lo que hace es:
- conseguir un
Stream<Integer>
de la lista - obteniendo un
IntStream
asignando cada elemento a sí mismo (función de identidad), desempaquetando elint
valor mantenido por cadaInteger
objeto (hecho automáticamente desde Java 5) - obteniendo la matriz de
int
llamandotoArray
También puedes llamar explícitamente intValue
a través de una referencia de método, es decir:
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
También vale la pena mencionar que puedes obtener un NullPointerException
si tienes algún null
referencia en la lista.Esto podría evitarse fácilmente agregando una condición de filtrado a la canalización de flujo como esta:
//.filter(Objects::nonNull) also works
int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray();
Ejemplo:
List<Integer> list = Arrays.asList(1, 2, 3, 4);
int[] arr = list.stream().mapToInt(i -> i).toArray(); //[1, 2, 3, 4]
list.set(1, null); //[1, null, 3, 4]
arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray(); //[1, 3, 4]
Apache Commons tiene una clase ArrayUtils, que tiene un método toPrimitive () que hace exactamente esto.
import org.apache.commons.lang.ArrayUtils;
...
List<Integer> list = new ArrayList<Integer>();
list.add(new Integer(1));
list.add(new Integer(2));
int[] intArray = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));
Sin embargo, como se mostró Jon, es bastante fácil de hacer esto por sí mismo en lugar de utilizar las bibliotecas externas.
Google guayaba
Google guayaba proporciona una clara forma de hacer esto llamando Ints.toArray
.
List<Integer> list = ...;
int[] values = Ints.toArray(list);
Creo que la iteración utilizando el iterador de la lista es una mejor idea, como list.get(i)
puede tener malos resultados en función de la aplicación de lista:
private int[] buildIntArray(List<Integer> integers) {
int[] ints = new int[integers.size()];
int i = 0;
for (Integer n : integers) {
ints[i++] = n;
}
return ints;
}
Dólar debería ser bastante simple:
List<Integer> list = $(5).toList(); // the list 0, 1, 2, 3, 4
int[] array = $($(list).toArray()).toIntArray();
Tengo la intención de mejorar la DSL con el fin de eliminar la llamada toArray()
intermedia
Si está utilizando Eclipse Colecciones , puede utilizar el método collectInt()
para cambiar de una objeto de contenedor a un recipiente int primitivo.
List<Integer> integers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
MutableIntList intList =
ListAdapter.adapt(integers).collectInt(i -> i);
Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intList.toArray());
Si usted puede convertir su ArrayList
a un FastList
, usted puede deshacerse del adaptador.
Assert.assertArrayEquals(
new int[]{1, 2, 3, 4, 5},
Lists.mutable.with(1, 2, 3, 4, 5)
.collectInt(i -> i).toArray());
Nota:. Soy un confirmador de colecciones Eclipse
Me desconcierta que fomentemos una sola vez los métodos personalizados cada vez que un perfecto estado, biblioteca bien utilizado como Apache Commons ha resuelto el problema ya. Aunque la solución es trivial si no es absurdo, es irresponsable para fomentar este tipo de comportamiento debido al mantenimiento a largo plazo y la accesibilidad.
Sólo tienes que ir con Apache Commons
Usted puede simplemente copiarlo en una matriz:
int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
arr[i] = list.get(i);
}
No es demasiado elegante; pero, bueno, funciona ...
Este segmento de código está trabajando para mí, intente lo siguiente:
Integer[] arr = x.toArray(new Integer[x.size()]);
Vale la pena mencionar ArrayList debe ser declarada como esto:
ArrayList<Integer> list = new ArrayList<>();
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
int[] result = null;
StringBuffer strBuffer = new StringBuffer();
for (Object o : list) {
strBuffer.append(o);
result = new int[] { Integer.parseInt(strBuffer.toString()) };
for (Integer i : result) {
System.out.println(i);
}
strBuffer.delete(0, strBuffer.length());
}
Integer[] arr = (Integer[]) x.toArray(new Integer[x.size()]);
Acceso arr
como int[]
normal.