Comment convertir un ArrayList contenant des entiers en primitif int?

J’essaie de convertir un object ArrayList contenant des objects 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 x = new ArrayList(); int[] n = (int[])x.toArray(int[x.size()]); 

Vous pouvez convertir, mais je ne pense pas que quelque chose soit intégré pour le faire automatiquement:

 public static int[] convertIntegers(List 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 lancera une exception NullPointerException si des integers ou des éléments sont null .)

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

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

Si vous utilisez java-8, il existe également un autre moyen de le faire.

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

Qu’est-ce qu’il fait est:

  • obtenir un Stream de la liste
  • obtenir un IntStream en mappant chaque élément sur lui-même (fonction d’identité), en déballant la valeur int de chaque object Integer (effectuée automatiquement depuis Java 5)
  • obtenir le tableau de int en appelantArray

Vous pouvez également appeler explicitement intValue via une référence de méthode, à savoir:

 int[] arr = list.stream().mapToInt(Integer::intValue).toArray(); 

Il convient également de mentionner que vous pouvez obtenir une NullPointerException si vous avez une référence null dans la liste. Cela pourrait être facilement évité en ajoutant une condition de filtrage au pipeline de stream comme ceci:

  //.filter(Objects::nonNull) also works int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray(); 

Exemple:

 List list = Arrays.asList(1, 2, 3, 4); int[] arr = list.stream().mapToInt(i -> i).toArray(); //[1, 2, 3, 4] list.set(1, null); //[1, null, 3, 4] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray(); //[1, 3, 4] 

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

 import org.apache.commons.lang.ArrayUtils; ... List list = new ArrayList(); 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.

Google Goyave

Google Guava fournit un moyen pratique de faire cela en appelant Ints.toArray .

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

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

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

utiliser Dollar devrait être assez simple:

 List list = $(5).toList(); // the list 0, 1, 2, 3, 4 int[] array = $($(list).toArray()).toIntArray(); 

Je toArray() d’améliorer le DSL afin de supprimer l’appel toArray() intermédiaire

Si vous utilisez des collections Eclipse , vous pouvez utiliser la méthode collectInt() pour passer d’un conteneur d’objects à un conteneur int primitif.

 List integers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); MutableIntList intList = ListAdapter.adapt(integers).collectInt(i -> i); Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intList.toArray()); 

Si vous pouvez convertir votre ArrayList en FastList , vous pouvez vous en débarrasser.

 Assert.assertArrayEquals( new int[]{1, 2, 3, 4, 5}, Lists.mutable.with(1, 2, 3, 4, 5) .collectInt(i -> i).toArray()); 

Remarque: je suis un committer pour les collections Eclipse.

Il est dommage que nous encouragions les méthodes personnalisées chaque fois qu’une bibliothèque parfaitement adaptée, comme Apache Commons, a déjà résolu le problème. Bien que la solution soit sortingviale, voire absurde, il est irresponsable d’encourager un tel comportement en raison de la maintenance et de l’accessibilité à long terme.

Il suffit d’aller avec Apache Commons

Vous pouvez simplement le copier dans un tableau:

 int[] arr = new int[list.size()]; for(int i = 0; i < list.size(); i++) { arr[i] = list.get(i); } 

Pas trop chic mais bon, ça marche ...

Ce segment de code fonctionne pour moi, essayez ceci

 Integer[] arr = x.toArray(new Integer[x.size()]); 
  List list = new ArrayList(); list.add(1); list.add(2); int[] result = null; SsortingngBuffer strBuffer = new SsortingngBuffer(); for (Object o : list) { strBuffer.append(o); result = new int[] { Integer.parseInt(strBuffer.toSsortingng()) }; for (Integer i : result) { System.out.println(i); } strBuffer.delete(0, strBuffer.length()); } 
 Integer[] arr = (Integer[]) x.toArray(new Integer[x.size()]); 

access arr comme normal int[] .