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()]);
¿Fue útil?

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

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top