java - Come convertire un ArrayList contenente gli Integer nell'array primitivo int?




java list (9)

Sto cercando di convertire un oggetto ArrayList contenente oggetti interi in primitive int [] con il seguente pezzo di codice, ma sta generando un errore in fase di compilazione. È possibile convertire in Java?

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

Google Guava

Google Guava fornisce un modo semplice per farlo chiamando Ints.toArray .

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

Apache Commons

Potresti usare

int[] x = ArrayUtils.toPrimitive(x.toArray(new Integer[0]))

Anche

int[] lst=new int[0]; // you could also write null if you are sure x contains values.
for (Integer i:x) {
    lst = ArrayUtils.add(lst,i);
}

è possibile.


Credo che iterare utilizzando l'iteratore di List sia un'idea migliore, dato che list.get(i) può avere prestazioni scadenti a seconda dell'implementazione List:

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

Mi sconcerta che incoraggiamo metodi personalizzati una tantum ogni volta che una biblioteca perfettamente valida e ben utilizzata come Apache Commons ha già risolto il problema. Anche se la soluzione è banale, se non assurda, è irresponsabile incoraggiare un tale comportamento a causa della manutenzione e dell'accessibilità a lungo termine.

Basta andare con Apache Commons


Puoi semplicemente copiarlo su un array:

int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
    arr[i] = list.get(i);
}

Non troppo elaborato; ma, ehi, funziona ...


Questo segmento di codice funziona per me, prova questo

Integer[] arr = x.toArray(new Integer[x.size()]);

Se stai usando java-8 c'è anche un altro modo per farlo.

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

Quello che fa è:

  • ottenere uno Stream<Integer> dall'elenco
  • ottenendo un IntStream mappando ogni elemento a se stesso (funzione identità), annullando la chiusura del valore int trattenuto da ciascun oggetto Integer (eseguito automaticamente da Java 5)
  • ottenere la matrice di toArray chiamando toArray

È anche possibile chiamare esplicitamente intValue tramite un riferimento al metodo, ovvero:

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

Vale anche la pena ricordare che potresti ottenere una NullPointerException se hai un riferimento null nell'elenco. Questo potrebbe essere facilmente evitato aggiungendo una condizione di filtraggio alla pipeline dello stream come questa:

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

Esempio:

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]

l'utilizzo di Dollar dovrebbe essere abbastanza semplice:

List<Integer> list = $(5).toList(); // the list 0, 1, 2, 3, 4  
int[] array = $($(list).toArray()).toIntArray();

Sto pianificando di migliorare il DSL per rimuovere la toArray() intermedia toArray()


Integer[] arr = (Integer[]) x.toArray(new Integer[x.size()]);

accesso arr come normale int[] .





primitive-types