metodos llenar listas imprimir example elementos ejemplos como bidimensional agregar java arrays arraylist primitive-types

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 valor int retenido por cada objeto Integer (hecho automáticamente desde Java 5)
  • obtener la matriz de int llamando a toArray

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[] .