我有一个像这样的变量:
List<Double> frameList = new ArrayList<Double>();
/* Double elements has added to frameList */
double[]
在Java中,如何才能获得具有Java中该变量类型的新变量?
Answers:
高性能-每个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
值。
doubles.get(i)
,尽管我们知道发问者提供了ArrayList。这样的方法: double[] tmp = new double[doubles.size()]; int idx = 0; for (Double d : doubles) { tmp[idx] = d; idx++; }
对每个List(甚至Collection)都适用。
用 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()
以获取数组。map
返回一个惰性流,请参见stackoverflow.com/questions/23696317/…)。
番石榴有一种方法可以为您做到这一点:double [] Doubles.toArray(Collection <Double>)
这并不一定比循环遍历Collection
并将每个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);
您可以在一行中直接使用它:
double[] array = ArrayUtils.toPrimitive(frameList.toArray(new Double[frameList.size()]));
ArrayUtils
是Apache库的一部分,而不是标准Java:的一部分org.apache.commons.lang3.ArrayUtils
。但这还是一个很好的解决方案。
您可以使用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的撰稿人。