Come convertire int [] in List <Integer> in Java?


382

Come faccio a convertire int[]in List<Integer>Java?

Certo, sono interessato a qualsiasi altra risposta oltre a farlo in un ciclo, articolo per articolo. Ma se non c'è altra risposta, sceglierò questa come la migliore per mostrare il fatto che questa funzionalità non fa parte di Java.


Possiamo usare IntStream.Of (array) .collect (Collectors.toList)
Saroj Kumar Sahoo

Risposte:


259

Non ci sono scorciatoie per la conversione da int[]a in List<Integer>quanto Arrays.asListnon si occupa di boxe e creerà semplicemente un List<int[]>che non è quello che vuoi. Devi fare un metodo di utilità.

int[] ints = {1, 2, 3};
List<Integer> intList = new ArrayList<Integer>(ints.length);
for (int i : ints)
{
    intList.add(i);
}

32
È meglio inizializzare l'elenco con le dimensioni dell'array
David Rabinowitz,

110
per (int i: ints) intList.add (i);
Stephen Denne,

18
@willcodejavaforfood - David significa che è meglio: new ArrayList <Integer> (ints.length);
Stephen Denne,

12
@willcodejavaforfood: dichiarare la dimensione dell'ArrayList al momento della sua costruzione gli impedirà di ridimensionare internamente dopo l'aggiunta di un certo importo. Non sono sicuro che il vantaggio sia piccolo, ma c'è sicuramente un vantaggio.
Grundlefleck

10
new ArrayList<Integer>() {{ for (int i : ints) add(i); }}
saka1029,

350

Flussi

In Java 8 puoi farlo

int[] ints = {1,2,3};
List<Integer> list = Arrays.stream(ints).boxed().collect(Collectors.toList());

21
Equivalente a: Arrays.stream (ints) .boxed (). Collect (Collectors.toList ());
njfrost,

4
@njfrost Hai ragione e IntStream.of chiama Arrays.stream quindi ho migliorato la risposta seguendo il tuo suggerimento
mikeyreilly

Per qualche motivo, questo non sembra restituire il tipo di risultato previsto su Android Studio (funziona su Eclipse) Dice, Elenco previsto <Integer> trovato Elenco <Oggetto>.
Eugenio Lopez,

Sembra pulito e conciso, ma quando l'ho usato in contrapposizione alla soluzione di base fornita da @willcodejavaforfood su leetcode le prestazioni del programma sono diminuite in termini di memoria e runtime
chitresh sirohi

@chitreshsirohi è perché le funzioni lambda utilizzate negli stream provocano Java per creare alcune classi anonime.
Ashvin Sharma,

175

Anche dalle librerie guava ... com.google.common.primitives.Ints:

List<Integer> Ints.asList(int...)

11
Questa dovrebbe essere la risposta giusta. Vedi la seconda frase della domanda: "Certo, sono interessato a qualsiasi altra risposta oltre a farlo in un ciclo, elemento per elemento."
josketres,

Grazie, grazie, grazie! Funziona anche con Longs.asList (long ...).
Craastad,

2
Ci sono alcune sottigliezze qui. L'elenco restituito utilizza l'array fornito come archivio di backup, quindi non è necessario mutare l'array. L'elenco inoltre non garantisce l'identità degli oggetti Integer contenuti. Cioè, il risultato di list.get (0) == list.get (0) non è specificato.
Pburka,

1
Fai attenzione al conteggio dei riferimenti di metodo su Android quando aggiungi librerie. Buona scoperta però.
milosmns,

95

Arrays.asList non funzionerà come previsto da altre risposte.

Questo codice non creerà un elenco di 10 numeri interi. Stampa 1 , non 10 :

int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List lst = Arrays.asList(arr);
System.out.println(lst.size());

Questo creerà un elenco di numeri interi:

List<Integer> lst = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

Se hai già l'array di ints, non esiste un modo rapido per convertire, stai meglio con il loop.

D'altra parte, se l'array ha Oggetti, non primitivi, Arrays.asList funzionerà:

String str[] = { "Homer", "Marge", "Bart", "Lisa", "Maggie" };
List<String> lst = Arrays.asList(str);

2
Nota che quell'elenco è immutabile
Danielson,

51

Aggiungerò un'altra risposta con un metodo diverso; nessun loop ma una classe anonima che utilizzerà le funzionalità di autoboxing:

public List<Integer> asList(final int[] is)
{
    return new AbstractList<Integer>() {
            public Integer get(int i) { return is[i]; }
            public int size() { return is.length; }
    };
}

1
+1 questo è più breve del mio ma il mio funziona per tutti i tipi di primitivi
dfa,

5
Mentre più veloce e utilizza meno memoria rispetto alla creazione di un ArrayList, il compromesso è List.add () e List.remove () non funzionano.
Stephen Denne,

3
Mi piace molto questa soluzione per array di grandi dimensioni con schemi di accesso sparsi, ma per gli elementi a cui si accede frequentemente comporterebbe molte istanze inutili di Integer (ad esempio se si accedesse allo stesso elemento 100 volte). Inoltre dovresti definire Iterator e racchiudere il valore restituito in Collections.unmodifiableList.
Adamski,

@Christoffer grazie. Ho aggiunto il setmetodo e ora posso persino ordinare l'array ...
Freedev,

39

Il codice più piccolo sarebbe:

public List<Integer> myWork(int[] array) {
    return Arrays.asList(ArrayUtils.toObject(array));
}

da dove ArrayUtils proviene da commons-lang :)


9
Basta notare ArrayUtilsche è una libreria relativamente grande per un'app per Android
msysmilu,

L'operazione opposta è descritta qui: stackoverflow.com/a/960507/1333157 ArrayUtils.toPrimitive(...) è la chiave.
ZeroOne,

26

In Java 8 con stream:

int[] ints = {1, 2, 3};
List<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, Arrays.stream(ints).boxed().toArray(Integer[]::new));

o con i collezionisti

List<Integer> list =  Arrays.stream(ints).boxed().collect(Collectors.toList());

3
Perché non usare semplicemente un collezionista?
assylias,

19

In Java 8:

int[] arr = {1,2,3};
IntStream.of(arr).boxed().collect(Collectors.toList());

16

Se stai usando Java 8, possiamo usare l'API stream per convertirla in un elenco.

List<Integer> list = Arrays.stream(arr)     // IntStream 
                                .boxed()        // Stream<Integer>
                                .collect(Collectors.toList());

Puoi anche usare IntStream per convertire.

List<Integer> list = IntStream.of(arr) // return Intstream
                                    .boxed()        // Stream<Integer>
                                    .collect(Collectors.toList());

Ci sono altre librerie esterne come guava e anche i comuni apache disponibili per convertirlo.

Saluti.


11

Vale anche la pena dare un'occhiata a questo bug report , che è stato chiuso con il motivo "Not a defect" e il seguente testo:

"L'autoboxing di interi array non è un comportamento specificato, per una buona ragione. Può essere proibitivo per array di grandi dimensioni."


7

prova a questa lezione:

class PrimitiveWrapper<T> extends AbstractList<T> {

    private final T[] data;

    private PrimitiveWrapper(T[] data) {
        this.data = data; // you can clone this array for preventing aliasing
    }

    public static <T> List<T> ofIntegers(int... data) {
        return new PrimitiveWrapper(toBoxedArray(Integer.class, data));
    }

    public static <T> List<T> ofCharacters(char... data) {
        return new PrimitiveWrapper(toBoxedArray(Character.class, data));
    }

    public static <T> List<T> ofDoubles(double... data) {
        return new PrimitiveWrapper(toBoxedArray(Double.class, data));
    }  

    // ditto for byte, float, boolean, long

    private static <T> T[] toBoxedArray(Class<T> boxClass, Object components) {
        final int length = Array.getLength(components);
        Object res = Array.newInstance(boxClass, length);

        for (int i = 0; i < length; i++) {
            Array.set(res, i, Array.get(components, i));
        }

        return (T[]) res;
    }

    @Override
    public T get(int index) {
        return data[index];
    }

    @Override
    public int size() {
        return data.length;
    }
}

TestCase:

List<Integer> ints = PrimitiveWrapper.ofIntegers(10, 20);
List<Double> doubles = PrimitiveWrapper.ofDoubles(10, 20);
// etc

5

Lo scatto migliore:

**
 * Integer modifiable fix length list of an int array or many int's.
 *
 * @author Daniel De Leon.
 */
public class IntegerListWrap extends AbstractList<Integer> {

    int[] data;

    public IntegerListWrap(int... data) {
        this.data = data;
    }

    @Override
    public Integer get(int index) {
        return data[index];
    }

    @Override
    public Integer set(int index, Integer element) {
        int r = data[index];
        data[index] = element;
        return r;
    }

    @Override
    public int size() {
        return data.length;
    }
}
  • Supporto ottenere e impostare.
  • Nessuna duplicazione dei dati di memoria.
  • Non perdere tempo nei circuiti.

Esempi:

int[] intArray = new int[]{1, 2, 3};
List<Integer> integerListWrap = new IntegerListWrap(intArray);
List<Integer> integerListWrap1 = new IntegerListWrap(1, 2, 3);

Mi piace di più Ma
userei

1

Se sei aperto all'utilizzo di una libreria di terze parti, funzionerà nelle raccolte Eclipse :

int[] a = {1, 2, 3};
List<Integer> integers = IntLists.mutable.with(a).collect(i -> i);
Assert.assertEquals(Lists.mutable.with(1, 2, 3), integers);

Nota: sono un committer per le raccolte Eclipse .


1
   /* Integer[] to List<Integer> */



        Integer[] intArr = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
        List<Integer> arrList = new ArrayList<>();
        arrList.addAll(Arrays.asList(intArr));
        System.out.println(arrList);


/* Integer[] to Collection<Integer> */


    Integer[] intArr = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
    Collection<Integer> c = Arrays.asList(intArr);

1

Che dire di questo:

int[] a = {1,2,3}; Integer[] b = ArrayUtils.toObject(a); List<Integer> c = Arrays.asList(b);


1

Ecco una soluzione:

int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

Integer[] iArray = Arrays.stream(array).boxed().toArray(Integer[]::new);
System.out.println(Arrays.toString(iArray));

List<Integer> list = new ArrayList<>();
Collections.addAll(list, iArray);
System.out.println(list);

Produzione:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

1

Ecco un'altra possibilità, sempre con Java 8 Streams:

void intArrayToListOfIntegers(int[] arr, List<Integer> list) {
    IntStream.range(0, arr.length).forEach(i -> list.add(arr[i]));
}

0

Ecco un modo generico per convertire l'array in ArrayList

<T> ArrayList<T> toArrayList(Object o, Class<T> type){
    ArrayList<T> objects = new ArrayList<>();
    for (int i = 0; i < Array.getLength(o); i++) {
        //noinspection unchecked
        objects.add((T) Array.get(o, i));
    }
    return objects;
}

uso

ArrayList<Integer> list = toArrayList(new int[]{1,2,3}, Integer.class);

0
int[] arr = { 1, 2, 3, 4, 5 };

List<Integer> list = Arrays.stream(arr)     // IntStream
                            .boxed()        // Stream<Integer>
                            .collect(Collectors.toList());

vedi questo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.