Comment convertir de List en double en Java?

J’ai une variable comme ça:

List frameList = new ArrayList(); /* Double elements has added to frameList */ 

Comment puis-je avoir une nouvelle variable ayant un type de double[] partir de cette variable en Java avec des performances élevées?

Haute performance – chaque object Double enveloppe une seule valeur double . Si vous voulez stocker toutes ces valeurs dans un tableau double[] , vous devez parcourir la collection d’instances Double . Un mappage O(1) n’est pas possible, cela devrait être le plus rapide possible:

  double[] target = new double[doubles.size()]; for (int i = 0; i < target.length; i++) { target[i] = doubles.get(i).doubleValue(); // java 1.4 style // or: target[i] = doubles.get(i); // java 1.5+ style (outboxing) } 

Merci pour la question supplémentaire dans les commentaires;) Voici le code source de la méthode ArrayUtils#toPrimitive :

 public static double[] toPrimitive(Double[] array) { if (array == null) { return null; } else if (array.length == 0) { return EMPTY_DOUBLE_ARRAY; } final double[] result = new double[array.length]; for (int i = 0; i < array.length; i++) { result[i] = array[i].doubleValue(); } return result; } 

(Et croyez-moi, je ne l'ai pas utilisé pour ma première réponse - même si ça a l'air ... très similaire :-D)

Au fait, la complexité de la réponse de Marcelos est O (2n), car elle itère deux fois (dans les coulisses): d'abord pour faire un Double[] de la liste, puis pour déballer les valeurs double .

Avec java-8 , vous pouvez le faire de cette façon.

 double[] arr = frameList.stream().mapToDouble(Double::doubleValue).toArray(); //via method reference double[] arr = frameList.stream().mapToDouble(d -> d).toArray(); //identity function, Java unboxes automatically to get the double value 

Qu’est-ce qu’il fait est:

  • obtenir le Stream de la liste
  • mapper chaque instance double à sa valeur primitive, résultant en un DoubleStream
  • appelez toArray() pour obtenir le tableau.

Guava a une méthode pour le faire pour vous: double [] Doubles.toArray (Collection )

Cela ne va pas nécessairement être plus rapide que de simplement parcourir la Collection et append chaque object Double au tableau, mais c’est beaucoup moins important pour vous d’écrire.

frameList.toArray (new double [0])

Vous pouvez utiliser la classe ArrayUtils de commons-lang pour obtenir un double [] à partir d’un double [].

 Double[] ds = frameList.toArray(new Double[frameList.size()]); ... double[] d = ArrayUtils.toPrimitive(ds); 

Vous pouvez convertir en un Double[] en appelant frameList.toArray(new Double[frameList.size()]) , mais vous devrez itérer la liste / tableau pour convertir en double[]

Selon votre question,

 List frameList = new ArrayList(); 
  1. Vous devez d’abord convertir List en Double [] en utilisant

    Double [] array = frameList.toArray (new Double [frameList.size ()]);

  2. Ensuite, vous pouvez convertir Double [] en double [] en utilisant

    double [] doubleArray = ArrayUtils.toPrimitive (array);

Vous pouvez directement l’utiliser dans une ligne,

 double[] array = ArrayUtils.toPrimitive(frameList.toArray(new Double[frameList.size()])); 

Vous pouvez utiliser des collections primitives des collections Eclipse et éviter toute boxe.

 DoubleList frameList = DoubleLists.mutable.empty(); double[] arr = frameList.toArray(); 

Si vous ne pouvez pas ou ne voulez pas initialiser une liste DoubleList :

 List frames = new ArrayList<>(); double[] arr = ListAdapter.adapt(frames).asLazy().collectDouble(each -> each).toArray(); 

Note: Je consortingbue aux collections Eclipse.