在Java中如何从List <Double>转换为double []?


74

我有一个像这样的变量:

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

/* Double elements has added to frameList */

double[]在Java中,如何才能获得具有Java中该变量类型的新变量?

Answers:


50

高性能-每个Double对象都包装一个double值。如果要将所有这些值存储到double[]数组中,则必须遍历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)
 }

感谢评论中的其他问题;)这是fittingArrayUtils#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),因为它迭代了两次(在后台):首先Double[]从列表中进行,然后解开double值。


将您对性能的建议与@MarceloHernándezRish的建议相比如何?
卡马西

@kamaci Andreas的答案是最佳的。
马塞洛(Marcelo)

8
从技术上讲,O(2n)= O(n)
Rohit Pandey

我建议避免使用doubles.get(i),尽管我们知道发问者提供了ArrayList。这样的方法: double[] tmp = new double[doubles.size()]; int idx = 0; for (Double d : doubles) { tmp[idx] = d; idx++; }对每个List(甚至Collection)都适用。
user3389669 '16

98

,您可以这样做。

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()以获取数组。

您在幕后的回答有多复杂?
卡马奇'16

@kamaci管道的每个元素都会被访问一次,因此基本顺序管道的O(n)(map返回一个惰性流,请参见stackoverflow.com/questions/23696317/…)。
亚历克西斯(Alexis C.)


8

您可以使用ArrayUtilscommons-lang中的类从中获取double[]a Double[]

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

7

根据您的问题,

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

您可以在一行中直接使用它:

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

1
重要的是要注意这ArrayUtils是Apache库的一部分,而不是标准Java:的一部分org.apache.commons.lang3.ArrayUtils。但这还是一个很好的解决方案。
brimborium

6

您可以Double[]通过调用将转换为frameList.toArray(new Double[frameList.size()]),但是您需要迭代列表/数组以将其转换为double[]


2

您可以使用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的撰稿人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.