簡體   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