そのような変数があります:
List<Double> frameList = new ArrayList<Double>();
/* Double elements has added to frameList */
新しい変数をJavaの高性能でその変数からのdouble[]
の型にできますか?
高性能-すべてのDouble
オブジェクトは単一のdouble
値をラップします。これらのすべての値を_double[]
_配列に格納する場合、haveを使用してDouble
インスタンスのコレクションを反復処理します。 O(1)
マッピングは不可能です。これはあなたが得ることができる最速でなければなりません:
_ 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)
}
_
コメントに追加の質問をありがとう;)ここに、フィッティング_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;
}
_
(そして、私を信じてください、私は最初の答えにそれを使用しませんでした-たとえそれが...かなり似ているように見えても:-D)
ところで、Marcelosの答えの複雑さはO(2n)です。なぜなら、それは2回(舞台裏で)繰り返されるからです:最初にリストから_Double[]
_を作成し、次にdouble
値をアンラップします。
Java-8 を使用すると、この方法で実行できます。
_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
_
それは何ですか:
Stream<Double>
_を取得しますDoubleStream
を生成しますtoArray()
を呼び出して配列を取得します。Guava には、これを行うためのメソッドがあります。 double [] Doubles.toArray(Collection <Double>)
これは、必ずしもCollection
をループして各Double
オブジェクトを配列に追加するよりも高速になるとは限りませんが、記述するのははるかに少なくなります。
Commons-langのArrayUtils
クラスを使用して、double[]
からDouble[]
を取得できます。
Double[] ds = frameList.toArray(new Double[frameList.size()]);
...
double[] d = ArrayUtils.toPrimitive(ds);
frameList.toArray(new Double[frameList.size()])
を呼び出すことでDouble[]
に変換できますが、リスト/配列を繰り返してdouble[]
に変換する必要があります
あなたの質問によると、
List<Double> frameList = new ArrayList<Double>();
まず、次を使用してList<Double>
をDouble[]
に変換する必要があります
Double[] array = frameList.toArray(new Double[frameList.size()]);
次にDouble[]
をdouble[]
に変換できます
double[] doubleArray = ArrayUtils.toPrimitive(array);
1行で直接使用できます。
double[] array = ArrayUtils.toPrimitive(frameList.toArray(new Double[frameList.size()]));
Eclipse Collections のプリミティブコレクションを使用し、ボックス化を完全に回避できます。
DoubleList frameList = DoubleLists.mutable.empty();
double[] arr = frameList.toArray();
DoubleList
を初期化できない、または初期化したくない場合:
List<Double> frames = new ArrayList<>();
double[] arr = ListAdapter.adapt(frames).asLazy().collectDouble(each -> each).toArray();
注:私はEclipse Collectionsの寄稿者です。