llenar - listas en java netbeans
¿Cómo convertir un ArrayList que contiene enteros a una matriz int primitiva? (12)
Estoy intentando convertir un ArrayList que contiene objetos Integer a primitivo int [] con el siguiente fragmento de código, pero está generando 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()]);
Guayaba de google
Google Guava proporciona una forma sencilla de hacerlo llamando a Ints.toArray
.
List<Integer> list = ...;
int[] values = Ints.toArray(list);
Apache Commons tiene una clase ArrayUtils, que tiene un método paraPrimitive () 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 demostró Jon, es bastante fácil hacerlo solo en lugar de usar bibliotecas externas.
Creo que iterar usando el iterador de la Lista es una mejor idea, ya que list.get(i)
puede tener un bajo rendimiento dependiendo de la implementación de la 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;
}
Este segmento de código está funcionando para mí, intente esto
Integer[] arr = x.toArray(new Integer[x.size()]);
Me desconcierta que alentemos métodos personalizados únicos cuando una biblioteca perfectamente buena y bien utilizada como Apache Commons ya haya resuelto el problema. Si bien la solución es trivial, si no absurda, es irresponsable fomentar este tipo de comportamiento debido al mantenimiento y la accesibilidad a largo plazo.
Sólo tienes que ir con Apache Commons
Puedes convertir, pero no creo que haya nada incorporado para 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 arrojará una NullPointerException si los integers
o cualquier elemento dentro de ella es null
).
EDITAR: De acuerdo con los comentarios, puede utilizar el iterador de listas para evitar costos desagradables con 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;
}
Si está utilizando Eclipse Collections , puede usar el método collectInt()
para cambiar de un contenedor de objetos a un contenedor 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 puede convertir su ArrayList
en un FastList
, 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 comentarista para las colecciones de Eclipse.
Si está utilizando java-8 , también hay otra forma de hacerlo.
int[] arr = list.stream().mapToInt(i -> i).toArray();
Lo que hace es:
- obteniendo un
Stream<Integer>
de la lista - obtener un
IntStream
asignando cada elemento a sí mismo (función de identidad), desempaquetando el valorint
retenido por cada objetoInteger
(hecho automáticamente desde Java 5) - obtener la matriz de
int
llamando atoArray
También puede llamar explícitamente a intValue
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 podría obtener una NullPointerException
si tiene alguna referencia null
en la lista. Esto podría evitarse fácilmente agregando una condición de filtrado a la tubería 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]
Simplemente puede copiarlo a 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, hey, funciona ...
Usando Dollar debería ser bastante simple:
List<Integer> list = $(5).toList(); // the list 0, 1, 2, 3, 4
int[] array = $($(list).toArray()).toIntArray();
Estoy planeando mejorar el DSL para eliminar la toArray()
intermedia toArray()
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 int[]
.