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?
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);
}
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);
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));
La question est à propos de l'autoboxing. Java convertit automatiquement int
Integer
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 taperT
int[]
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.
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));