[英]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[]
返回。
所以我有兩個問題:
Object[][]
表中獲取列數據並返回原語數組? 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.