446 Stimmen

Wie konvertiert man eine ArrayList mit Integers in ein primitives int-Array?

Ich versuche, eine ArrayList mit Integer-Objekte in primitive int[] mit dem folgenden Stück Code zu konvertieren, aber es wirft Kompilierungszeit Fehler. Ist es möglich, in Java zu konvertieren?

List<Integer> x =  new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);

416voto

Alexis C. Punkte 87062

Wenn Sie Folgendes verwenden java-8 Es gibt auch eine andere Möglichkeit, dies zu tun.

int[] arr = list.stream().mapToInt(i -> i).toArray();

Was sie tut, ist:

  • bekommen eine Stream<Integer> aus der Liste
  • Erlangung eines IntStream indem jedes Element auf sich selbst abgebildet wird (Identitätsfunktion), das Unboxing der int Wert, der von jedem Integer Objekt (erfolgt seit Java 5 automatisch)
  • das Array von int durch den Aufruf toArray

Sie könnten auch explizit aufrufen intValue über eine Methodenreferenz, d.h:

int[] arr = list.stream().mapToInt(Integer::intValue).toArray();

Es ist auch erwähnenswert, dass Sie eine NullPointerException wenn Sie eine null Referenz in der Liste. Dies könnte leicht vermieden werden, indem man der Stream-Pipeline eine Filterbedingung wie die folgende hinzufügt:

                       //.filter(Objects::nonNull) also works
int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray();

Exemple :

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]

266voto

Jon Skeet Punkte 1325502

Sie können konvertieren, aber ich glaube nicht, dass es eine Funktion gibt, die das automatisch macht:

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;
}

(Beachten Sie, dass dies eine NullPointerException auslöst, wenn entweder integers oder ein beliebiges Element darin ist null .)

EDIT: Wie pro Kommentare, können Sie die Liste Iterator verwenden möchten, um unangenehme Kosten mit Listen wie zu vermeiden 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;
}

87voto

Snehal Punkte 6680

Google Guava

Google Guava bietet dazu eine elegante Möglichkeit durch den Aufruf von Ints.toArray .

List<Integer> list = ...;
int[] values = Ints.toArray(list);

68voto

Björn Punkte 28353

Apache Commons hat eine ArrayUtils Klasse, die eine Methode toPrimitive() hat, die genau dies tut.

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]));

Wie Jon jedoch gezeigt hat, ist es ziemlich einfach, dies selbst zu tun, anstatt externe Bibliotheken zu verwenden.

43voto

Matthew Willis Punkte 44427

Ich glaube, die Iteration mit dem Iterator der Liste ist eine bessere Idee, da list.get(i) kann je nach der Implementierung der Liste eine schlechte Leistung aufweisen:

private int[] buildIntArray(List<Integer> integers) {
    int[] ints = new int[integers.size()];
    int i = 0;
    for (Integer n : integers) {
        ints[i++] = n;
    }
    return ints;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X