Comment créer ArrayList (ArrayList) à partir de array (int[]) en Java

j'ai vu la question: Créer une liste de tableaux de tableau

cependant quand j'essaie Cette solution avec le code suivant, elle ne fonctionne pas tout à fait dans tous les cas:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class ToArrayList {

    public static void main(String[] args) {
        // this works
        String[] elements = new String[] { "Ryan", "Julie", "Bob" };
        List<String> list = new ArrayList<String>(Arrays.asList(elements));
        System.out.println(list);

        // this works
        List<Integer> intList = null;
        intList = Arrays.asList(3, 5);
        System.out.println(intList);

        int[] intArray = new int[] { 0, 1 };
        // this doesn't work!
        intList = new ArrayList<Integer>(Arrays.asList(intArray));
        System.out.println(intList);
    }
}

Ce que je fais mal? Ne devrait pas le code intList = new ArrayList<Integer>(Arrays.asList(intArray)); compiler bien?

18
demandé sur Community 2013-07-08 11:15:52

5 réponses

Le problème

intList = new ArrayList<Integer>(Arrays.asList(intArray));

que int[] est considéré comme un seul Object instance puisqu'un tableau primitif s'étend de Object. Cela ne peut fonctionner que si vous avez Integer[] au lieu de int[] depuis maintenant vous envoyez un tableau de Object.

Integer[] intArray = new Integer[] { 0, 1 };
//now you're sending a Object array
intList = new ArrayList<Integer>(Arrays.asList(intArray));

à Partir de votre commentaire: si vous voulez toujours utiliser un int[] (ou un autre tableau de type primitif) comme données principales, alors vous devez créer un tableau supplémentaire avec la classe wrapper. Pour ce exemple:

int[] intArray = new int[] { 0, 1 };
Integer[] integerArray = new Integer[intArray.length];
int i = 0;
for(int intValue : intArray) {
    integerArray[i++] = intValue;
}
intList = new ArrayList<Integer>(Arrays.asList(integerArray));

mais puisque vous utilisez déjà un for boucle, je n'aurais pas l'esprit à l'aide d'un temp classe wrapper tableau, il suffit d'ajouter vos articles directement dans la liste:

int[] intArray = new int[] { 0, 1 };
intList = new ArrayList<Integer>();
for(int intValue : intArray) {
    intList.add(intValue);
}
24
répondu Luiggi Mendoza 2013-07-08 07:37:26

avec Java 8 Vous pouvez le faire en une ligne:

        
int[] intArr = { 1, 1, 2, 3, 5, 8, 11};  
List<Integer> list = Arrays.stream(intArr).boxed().collect(Collectors.toList());  
list.forEach(System.out::println);
9
répondu max 2014-11-02 09:47:13

cela ne fonctionne pas parce que vous utilisez un int[] au lieu de Integer[]. Essayez ceci:

Integer[] intArray = new Integer[] { 0, 1 };
// this should work now
intList = new ArrayList<Integer>(Arrays.asList(intArray));
7
répondu osorio 2013-07-08 08:32:36

La question est à propos de l'autoboxing. Java convertit automatiquement intInteger automatiquement, mais on ne convertit int[]Integer[]. D'où la raison.

public static <T> List<T> asList(T... a)

asList est défini comme ci-dessus. Il attend un vararg de type T. c'est à dire qu'il peut prendre un tableau d'objets de type T. Dans votre cas, parce que Java ne peut pas convertir int[]Integer[], d'où il faut taperTint[] plutôt que Integer comme souhaité. Par conséquent, vous obtenez une liste de type List<int[]. Vous devrez le convertir manuellement en `Integer[]int[]

Il y a un excellent article dans le livre Effective Java par Joshua Bloch où il explique les fosses avec varargs et celle-ci en est une.

6
répondu Jatin 2013-07-08 08:25:36

Collection veut des objets et les primitives ne dérivent pas d'objet. donc Integer autoriser int n'est pas autoriser.

vous devez donc utiliser la classe wrapper Integer au lieu de int qui est de type primitif.

exemple:

 Integer[] intArray = new Integer[] { 0, 1 };
 intList = new ArrayList<Integer>(Arrays.asList(intArray));
3
répondu bNd 2013-07-08 07:21:29