Comment créer ArrayList (ArrayList<Integer>) de la matrice (int[]) en Java
J'ai vu la question: Créer liste de tableaux à partir de la matrice de
Cependant, lorsque j'essaie cette solution avec le code suivant, il ne fonctionne pas 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 ici? Ne pas le code intList = new ArrayList<Integer>(Arrays.asList(intArray));
compiler bien?
- Merci pour toutes les réponses. J'ai trouvé plusieurs raisons à cela des erreurs de compilation: 1. Java n'est pas autobox primitive tableaux. 2. Varargs sont compliqués à utiliser correctement - stackoverflow.com/questions/2925153/...
- +1 c'est une bonne question. Je recommande à tous la lecture pour la lecture de toutes les réponses, elles s'ajoutent toutes les informations importantes.
Vous devez vous connecter pour publier un commentaire.
Le problème dans
est que
int[]
est considérée comme un seulObject
exemple depuis une primitive de tableau s'étend deObject
. Cela ne peut fonctionner que si vous avezInteger[]
au lieu deint[]
depuis maintenant, vous êtes à l'envoi d'un tableau deObject
.De votre commentaire: si vous voulez toujours utiliser un
int[]
(ou une autre primitive de type array) comme principales données, alors vous avez besoin pour créer un autre tableau avec la classe wrapper. Pour cet exemple:Mais puisque vous êtes déjà à l'aide d'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:Avec Java 8, vous pouvez le faire en une seule ligne:
La question est à propos de l'autoboxing. Java convertit automatiquement
int
àInteger
automatiquement, mais il ne convertit pasint[]
àInteger[]
. D'où la raison.asList
est défini comme ci-dessus. Il s'attend à un vararg de typeT
. c'est à dire qu'il peut prendre un tableau d'objets de typeT
. Dans votre cas, parce que Java ne peut pas convertirint[]
àInteger[]
, d'où il prend typeT
commeint[]
plutôt queInteger
comme souhaité. Par conséquent, vous obtenez une liste de typeList<int[]
. Vous devrez manuellement le convertir en`Integer[]
deint[]
Il y a un excellent article dans le livre
Effective Java
par Joshua Bloch, où il explique le puits avec de la varargs et c'est l'un d'entre eux.Il ne fonctionne pas parce que vous êtes à l'aide d'un
int[]
au lieu deInteger[]
. Essayez ceci:Collection veut des Objets et des primitives de ne pas dériver de l'Objet. donc
Integer
permettre, maisint
n'est pas autoriser.Donc vous devez utiliser une classe wrapper
Integer
au lieu deint
qui est de type primitif.Juste exemple: