题
我执行一个接口功能类似于一个表,其中可以包含一个类型的对象。该接口指定的下列功能:
double[] getDoubles(int columnIndex);
我难倒是在我的执行,我要保存的数据表在2D Object
array(Object[][] data
).当我需要返回的价值观,我想要做如下(假设 getDoubles()
只会呼吁列包含了一倍,所以不会有 ClassCastExceptions
):
double[] getDoubles(int columnIndex) {
return (double[]) data[columnIndex];
}
但Java不允许 Object[]
被丢到 double[]
.铸造它 Double[]
是好的,因为 Double
是的对象,而不是一种原始的,但是我的接口指定的数据将返回 double[]
.
因此,我有两个问题:
- 是否有任何种方式我可以得到的数据列出的
Object[][]
表以及返回系列原语? - 如果我不改变的界面,以回报
Double[]
, 会有任何性能的影响?
解决方案
不幸的是,你将需要循环整个列表和拆箱的 Double
如果你想转换一个 double[]
.
尽可能表现,有一些时间相关的拳击和拆箱元。如果设定足够小的,你不会看到任何性问题。
其他提示
如果你不介意使用一个第3方图书馆、公共-lang有ArrayUtils类型有各种各样的方法的操纵。
Double[] doubles;
...
double[] d = ArrayUtils.toPrimitive(doubles);
还有互补方法
doubles = ArrayUtils.toObject(d);
编辑:回答其余的问题。会有一些开销来这样做,但除非阵列是真正的大你不应该担心它。测试它第一次看到,如果这是一个问题之前,重构。
实现的方法,你实际上已经要求有关会得到这样的事情。
double[] getDoubles(int columnIndex) {
return ArrayUtils.toPrimitive(data[columnIndex]);
}
在Java8,这是一个衬垫:
Double[] boxed = new Double[] { 1.0, 2.0, 3.0 };
double[] unboxed = Stream.of(boxed).mapToDouble(Double::doubleValue).toArray();
注意,这仍然迭代原来的阵列,并创建一个新的一个。
你可以使用的每个环路建造一个临时阵列同样大小的再投每个单元和双但它在阵列。
所以:
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[] 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;
最后路线将把一类投例外。虽然每一个元件阵列确实是一个双人间,该阵列的建立是作为一系列的对象,而不是一系列一倍,因此铸是无效的。
你可以利用的ArrayUtils转换
Double[] d; // initialise
double[] array = ArrayUtils.toPrimitive(d);
没有必要循环的全部数据。