繁体   English   中英

如何将Double []转换为double []?

[英]How do I convert Double[] to double[]?

我正在实现一个接口,其功能类似于可以包含对象类型的表。 接口指定以下功能:

double[] getDoubles(int columnIndex);

我感到困惑的是,在我的实现中,我将表数据存储在2D Object数组( Object[][] data )。 当我需要返回值时,我想要执行以下操作(假设只在包含双精度的列上调用getDoubles() ,因此不会有ClassCastExceptions ):

double[] getDoubles(int columnIndex) {
    return (double[]) data[columnIndex];
}

但是 - Java不允许将Object[]强制转换为double[] 将它转换为Double[]是可以的,因为Double是一个对象而不是一个原语,但是我的接口指定数据将作为double[]返回。

所以我有两个问题:

  1. 有没有什么办法可以从Object[][]表中获取列数据并返回原语数组?
  2. 如果我确实更改了界面以返回Double[] ,是否会对性能产生影响?

如果您不介意使用第三方库,则commons-lang具有ArrayUtils类型以及各种操作方法。

Double[] doubles;
...
double[] d = ArrayUtils.toPrimitive(doubles);

还有补充方法

doubles = ArrayUtils.toObject(d);

编辑:回答问题的其余部分。 这样做会有一些开销,但除非阵列非常大,否则你不必担心它。 首先测试它,看看在重构之前它是否是一个问题。

实现你实际问过的方法会得到类似的东西。

double[] getDoubles(int columnIndex) {
    return ArrayUtils.toPrimitive(data[columnIndex]);
}

在Java 8中,这是一个单行:

Double[] boxed = new Double[] { 1.0, 2.0, 3.0 };
double[] unboxed = Stream.of(boxed).mapToDouble(Double::doubleValue).toArray();

请注意,这仍然会遍历原始数组并创建一个新数组。

不幸的是,你将需要遍历整个列表和拆箱Double ,如果你想将它转换为double[]

就性能而言,Java中的装箱和拆箱原语有一些时间。 如果该集合足够小,您将看不到任何性能问题。

你可以使用a for each循环来构造一个相同大小的临时数组,然后将每个单独的元素转换为double,但是在数组中。

所以:

double[] tempArray = new double[data[columnIndex].length];
int i = 0;
for(Double d : (Double) data[columnIndex]) {
  tempArray[i] = (double) d;
  i++;
}

如果我在这里错了,请纠正我。

如果你想返回一个double[] ,你需要创建一个new double[] ,填充它,并返回它。

这可能是一个很好的架构决策。 首先,将Object[]转换为Double[]并没有多大意义; 它不是真正的Double数组,因为它也可能有Object 其次,如果直接返回数组,用户代码可以修改它并改变对象的内部结构。

由于拆箱和分配成本,主要的性能影响是返回double[]数组。

除了jjnguy和Eric Koslow所说的,我没有任何东西可以添加到真正的问题中。

但只是旁注:你提到将一个Object数组转换为Double数组。 以下将不起作用:

Object[] oa=new Object[3];
oa[0]=new Double("1.0");
oa[1]=new Double("2.0");
oa[2]=new Double("3.0");
Double[] da=(Double[])oa;

最后一行将抛出一个类强制转换异常。 尽管数组中的每个元素确实都是Double,但数组是作为Objects数组创建的,而不是双打数组,因此转换无效。

您可以使用ArrayUtils进行转换

Double[] d; // initialise
double[] array = ArrayUtils.toPrimitive(d);

无需循环整个数据。

我会先回答ArrayUtils的答案,并补充一点,1.5 autoboxing文档via )有点显示没有内置方式:

如果除了从SC到TC的字符串转换之外没有允许的转换,则不允许从数组类型SC []转换为数组类型TC []

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM