web-dev-qa-db-fra.com

Comment lancer à partir de la liste <Double> doubler [] en Java?

J'ai une variable comme ça:

List<Double> frameList =  new ArrayList<Double>();

/* Double elements has added to frameList */

Comment puis-je avoir une nouvelle variable a un type de double[] à partir de cette variable dans Java avec de hautes performances?

58
kamaci

Haute performance - chaque objet Double encapsule une seule valeur double. Si vous voulez stocker toutes ces valeurs dans un tableau double[], Alors vous avez pour parcourir la collection d'instances Double. Un mappage O(1) n'est pas possible, il 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 d’ajustement 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 cela a l'air ... assez similaire :-D)

Au fait, la complexité de la réponse de Marcelos est O (2n), car elle itère deux fois (en coulisse): d’abord créer un Double[] À partir de la liste, puis décompresser les valeurs double .

42
Andreas_D

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:

  • récupérez le Stream<Double> dans la liste
  • mappe chaque instance double à sa valeur primitive, résultant en un DoubleStream
  • appelez toArray() pour obtenir le tableau.
85
Alexis C.

Guava possède une méthode pour ce faire à votre place: double [] Doubles.toArray (Collection <Double>)

Cela ne va pas nécessairement être plus rapide que de simplement parcourir en boucle le Collection et d'ajouter chaque objet Double au tableau, mais c'est beaucoup moins pour vous d'écrire.

26
ColinD

Vous pouvez utiliser la classe ArrayUtils de commons-lang pour obtenir un double[] de Double[].

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

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

5
Harry Lime

Selon votre question,

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

    Double[] array = frameList.toArray(new Double[frameList.size()]);
    
  2. Ensuite, vous pouvez convertir Double[] à double[] en utilisant

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

Vous pouvez directement l'utiliser sur une seule ligne:

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

Vous pouvez utiliser des collections primitives à partir de Eclipse Collections et éviter complètement la boxe.

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

Si vous ne pouvez ou ne voulez pas initialiser un DoubleList:

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

Remarque: je contribue aux collections Eclipse.

2
Nikhil Nanivadekar