767 votes

Comment convertir List<Integer> en int[] en Java ?

Cette question est similaire à la précédente : http://stackoverflow.com/questions/880581/java-convert-int-to-integer

Je suis nouveau en Java. Comment puis-je convertir une liste en int[] en Java ? Je suis confus car List.toArray() renvoie en fait un Object[], qui peut être converti en Integer[] ou int[].

Pour l'instant, j'utilise une boucle pour le faire :

int[] toIntArray(List<Integer> list){
  int[] ret = new int[list.size()];
  for(int i = 0;i < ret.length;i++)
    ret[i] = list.get(i);
  return ret;
}

Je suis sûr qu'il y a un meilleur moyen de faire ça.

1049voto

Pshemo Points 34648

Personne n'a encore mentionné les flux de Java 8, alors c'est parti :

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

261voto

Jon Skeet Points 692016

Malheureusement, je ne crois pas qu'il y ait vraiment est une meilleure façon de le faire en raison de la nature de la gestion des types primitifs, des boîtes, des tableaux et des génériques par Java. En particulier :

  • List<T>.toArray ne fonctionnera pas car il n'y a pas de conversion de Integer à int
  • Vous ne pouvez pas utiliser int comme argument de type pour les génériques, de sorte qu'il serait ont pour être un int (ou une méthode qui utilise la réflexion pour faire de vilains tours de passe-passe).

Je crois qu'il existe des bibliothèques qui ont des versions autogénérées de ce type de méthode pour tous les types primitifs (c'est-à-dire qu'il y a un modèle qui est copié pour chaque type). C'est moche, mais c'est comme ça, j'en ai peur :(

Même si le Arrays est sortie avant l'arrivée des génériques en Java, elle devrait encore inclure toutes les surcharges horribles si elle était introduite aujourd'hui (en supposant que vous vouliez utiliser des tableaux primitifs).

222voto

ColinD Points 48573

En plus de Commons Lang, vous pouvez le faire avec Goyave La méthode de l'UE Ints.toArray(Collection<Integer> collection) .

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

Cela vous évite d'avoir à effectuer vous-même la conversion intermédiaire des tableaux que l'équivalent de Commons Lang requiert.

182voto

Eddie Points 27755

Le moyen le plus simple d'y parvenir est d'utiliser la fonction Langage Apache Commons . Il possède une classe ArrayUtils très pratique qui peut faire ce que vous voulez. Utilisez le toPrimitive avec la surcharge pour un tableau de Integer s.

List<Integer> myList;
 ... assign and fill the list
int[] intArray = ArrayUtils.toPrimitive(myList.toArray(new Integer[myList.size()]));

De cette façon, vous ne réinventerez pas la roue. Commons Lang possède un grand nombre de choses utiles que Java a laissé de côté. Ci-dessus, j'ai choisi de créer une liste Integer de la bonne taille. Vous pouvez également utiliser un tableau Integer statique de longueur 0 et laisser Java allouer un tableau de la bonne taille :

static final Integer[] NO_INTS = new Integer[0];
   ....
int[] intArray2 = ArrayUtils.toPrimitive(myList.toArray(NO_INTS));

62voto

int[] toIntArray(List<Integer> list)  {
    int[] ret = new int[list.size()];
    int i = 0;
    for (Integer e : list)  
        ret[i++] = e.intValue();
    return ret;
}

Légère modification de votre code pour éviter l'indexation coûteuse des listes (puisqu'une liste n'est pas nécessairement une ArrayList, mais peut être une liste liée, pour laquelle l'accès aléatoire est coûteux).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X