it-swarm.com.de

Wie konvertiere ich in Java von List <Double> nach double []?

Ich habe eine Variable wie diese:

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

/* Double elements has added to frameList */

Wie kann ich eine neue Variable haben, hat einen Typ von double[] von dieser Variablen in Java mit hoher Leistung?

58
kamaci

Hohe Leistung - jedes Double Objekt umschließt einen einzelnen double Wert. Wenn Sie alle diese Werte in einem Array double[] Speichern möchten, müssen Sie haben die Auflistung von Double Instanzen durchlaufen. Eine O(1) Zuordnung ist nicht möglich, dies sollte die schnellste sein, die Sie bekommen können:

 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)
 }

Danke für die zusätzliche Frage in den Kommentaren;) Hier ist der Quellcode der passenden ArrayUtils#toPrimitive Methode:

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;
}

(Und glaub mir, ich habe es nicht für meine erste Antwort benutzt - obwohl es so aussieht ... ziemlich ähnlich :-D)

Die Komplexität der Marcelos-Antwort ist übrigens O (2n), weil sie zweimal (hinter den Kulissen) iteriert: Zuerst wird ein Double[] Aus der Liste erstellt, dann werden die double -Werte ausgepackt .

42
Andreas_D

Mit Java-8 können Sie dies auf diese Weise tun.

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

Was es tut, ist:

  • nimm den Stream<Double> aus der Liste
  • ordnen Sie jede doppelte Instanz ihrem primitiven Wert zu, was zu einem DoubleStream führt.
  • rufen Sie toArray() auf, um das Array abzurufen.
85
Alexis C.

Guava hat eine Methode, um dies für Sie zu tun: double [] Doubles.toArray (Collection <Double>)

Dies wird nicht unbedingt schneller sein, als nur die Collection durchzugehen und jedes Double -Objekt zum Array hinzuzufügen, aber Sie müssen viel weniger schreiben.

26
ColinD

Sie können die Klasse ArrayUtils von commons-lang verwenden, um ein double[] von einem Double[].

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

Sie können in einen Double[] Konvertieren, indem Sie frameList.toArray(new Double[frameList.size()]) aufrufen, aber Sie müssen die Liste/das Array iterieren, um sie/es in double[] Zu konvertieren.

5
Harry Lime

Wie pro ihre frage,

List<Double> frameList =  new ArrayList<Double>();
  1. Zuerst müssen Sie List<Double> In Double[] Konvertieren, indem Sie verwenden

    Double[] array = frameList.toArray(new Double[frameList.size()]);
    
  2. Als nächstes können Sie Double[] Mit in double[] Konvertieren

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

Sie können es direkt in einer Zeile verwenden:

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

Sie können primitive Sammlungen aus Eclipse-Sammlungen verwenden und das Boxen insgesamt vermeiden.

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

Wenn Sie ein DoubleList nicht initialisieren können oder wollen:

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

Hinweis: Ich arbeite an Eclipse-Sammlungen mit.

2