web-dev-qa-db-ja.com

JavaでList <Double>からdouble []に​​キャストする方法は?

そのような変数があります:

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

/* Double elements has added to frameList */

新しい変数をJavaの高性能でその変数からのdouble[]の型にできますか?

58
kamaci

高性能-すべての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値をアンラップします。

42
Andreas_D

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>_を取得します
  • 各doubleインスタンスをそのプリミティブ値にマップし、DoubleStreamを生成します
  • toArray()を呼び出して配列を取得します。
85
Alexis C.

Guava には、これを行うためのメソッドがあります。 double [] Doubles.toArray(Collection <Double>)

これは、必ずしもCollectionをループして各Doubleオブジェクトを配列に追加するよりも高速になるとは限りませんが、記述するのははるかに少なくなります。

26
ColinD

Commons-langのArrayUtilsクラスを使用して、double[]からDouble[]を取得できます。

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

frameList.toArray(new Double[frameList.size()])を呼び出すことでDouble[]に変換できますが、リスト/配列を繰り返してdouble[]に変換する必要があります

5
Harry Lime

あなたの質問によると、

List<Double> frameList =  new ArrayList<Double>();
  1. まず、次を使用してList<Double>Double[]に変換する必要があります

    Double[] array = frameList.toArray(new Double[frameList.size()]);
    
  2. 次にDouble[]double[]に変換できます

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

1行で直接使用できます。

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

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の寄稿者です。

2