379 votes

Comment convertir un ArrayList contenant des entiers en primitif int?

J'essaie de convertir un objet ArrayList contenant des objets Integer en primitive int [] avec le morceau de code suivant, mais il génère une erreur de compilation. Est-il possible de convertir en Java?

 List<Integer> x =  new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
 

338voto

ZouZou Points 23600

Si vous utilisez il y a aussi un autre moyen pour ce faire.

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

Ce qu'il fait est:

  • l'obtention d'un Stream<Integer> à partir de la liste
  • l'obtention d'un IntStream par la cartographie de chaque élément à lui-même (identité, fonction), unboxing la valeur int détenir par chaque objet Integer
  • l'obtention de la matrice de int en appelant toArray

Exemple:

List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4));
int[] arr = list.stream().mapToInt(i -> i).toArray(); //[1, 2, 3, 4]

256voto

Jon Skeet Points 692016

Vous pouvez convertir, mais je ne pense pas qu'il y ait quelque chose de construit pour le faire automatiquement:

 public static int[] convertIntegers(List<Integer> integers)
{
    int[] ret = new int[integers.size()];
    for (int i=0; i < ret.length; i++)
    {
        ret[i] = integers.get(i).intValue();
    }
    return ret;
}
 

(Notez que cela va générer une exception NullPointerException si integers ou un élément quelconque est null .)

EDIT: selon les commentaires, vous pouvez utiliser l'itérateur de liste pour éviter les coûts désagréables avec des listes telles que LinkedList :

 public static int[] convertIntegers(List<Integer> integers)
{
    int[] ret = new int[integers.size()];
    Iterator<Integer> iterator = integers.iterator();
    for (int i = 0; i < ret.length; i++)
    {
        ret[i] = iterator.next().intValue();
    }
    return ret;
}
 

82voto

Snehal Points 1769

Google Guava fournit maintenant un moyen pratique de le faire:

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

67voto

Björn Points 15485

Apache Commons a une classe ArrayUtils, qui a une méthode toPrimitive () qui fait exactement cela.

 import org.apache.commons.lang.ArrayUtils;
...
    List<Integer> list = new ArrayList<Integer>();
    list.add(new Integer(1));
    list.add(new Integer(2));
    int[] intArray = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));
 

Cependant, comme Jon l'a montré, il est assez facile de le faire vous-même au lieu d'utiliser des bibliothèques externes.

42voto

Matthew Willis Points 26453

Je pense que l'itération à l'aide de l'itérateur de List est une meilleure idée, car list.get(i) peut avoir de mauvaises performances en fonction de l'implémentation de List:

 private int[] buildIntArray(List<Integer> integers) {
    int[] ints = new int[integers.size()];
    int i = 0;
    for (Integer n : integers) {
        ints[i++] = n;
    }
    return ints;
}
 

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