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?
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
.
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:
Stream<Double>
dans la listeDoubleStream
toArray()
pour obtenir le tableau.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.
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);
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[]
Selon votre question,
List<Double> frameList = new ArrayList<Double>();
Vous devez d'abord convertir List<Double>
à Double[]
en utilisant
Double[] array = frameList.toArray(new Double[frameList.size()]);
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()]));
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.