2011-05-16 131 views

回答

35

高性能 - 每個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) 
} 

感謝您的評論的附加問題;)這裏的配件ArrayUtils#toPrimitive方法的源代碼:

​​

(相信我,我沒有用它作爲我的第一個答案 - 即使它看起來......很相似:-D)

順便說一句,複雜性Marcelos的答案是O(2n),因爲它迭代了兩次(在幕後):首先從列表中製作Double[],然後解開double值。

+0

比較你對性能的建議與@MarceloHernándezRish的訴訟怎麼樣? – kamaci 2011-05-16 19:08:45

+0

@kamaci Andreas的回答是最優的。 – Marcelo 2011-05-17 21:17:00

+6

從技術上講,O(2n)= O(n) – 2013-11-10 06:36:48

6

frameList.toArray(新雙[0])

您可以使用從公地郎ArrayUtils類獲得雙重[]從雙[]。

Double[] ds = frameList.toArray(new Double[frameList.size()]); 
... 
double[] d = ArrayUtils.toPrimitive(ds); 
+2

這將是更好的正確大小的數組來傳遞。 – SLaks 2011-05-16 13:41:49

+1

恥辱它不編譯。 ;) – 2011-05-16 13:43:30

+0

這不會給出像'類型列表不適用於參數(雙[])'錯誤' – 2011-05-16 13:44:23

5

你可以通過調用frameList.toArray(new Double[frameList.size()])轉換爲Double[],但你需要遍歷列表/數組轉換爲double[]

20

Guava已經爲你做這個的方法:double[] Doubles.toArray(Collection<Double>)

這不一定會是任何不僅僅是通過Collection循環和增加每個Double對象數組更快,但它是少了很多你寫。

+1

最好的答案。更少的代碼更好,依靠重用。 – 2013-08-06 22:42:34

+1

恐怕你的表演聲明是錯誤的 - 除非'List '由'Doubles.asList(double ...)'創建,那麼'Doubles.toArray'(集合)'使得它自己對列表的調用。指定者()'。 – amaidment 2015-06-02 13:01:59

+0

@amaidment是正確的 - 你可以閱讀[這裏](https://github.com/google/guava/blob/master/guava/src/com/google/common/primitives/Doubles.java)。 – user3389669 2016-01-04 18:26:46

54

,你可以這樣做。

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()得到陣列。
+0

你在幕後回答的複雜性是什麼? – kamaci 2016-08-30 12:39:20

+0

@kamaci管道的每個元素都將被訪問一次,因此O(n)對於基本的順序管道('map'返回一個惰性流,請參閱http://stackoverflow.com/questions/23696317/java-8-find -first-元件逐謂詞/ 23696571#23696571)。 – 2016-09-10 08:13:48

2

您可以使用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正宗的貢獻。

3

根據您的問題,

List<Double> frameList = new ArrayList<Double>(); 
  1. 首先,你必須使用

    雙[]數組= frameList.toArray(新雙[frameList.size到列表轉換爲雙[] ()]);

  2. 接着可以轉換雙[],用

    雙[]的doubleArray = ArrayUtils.toPrimitive(陣列)的兩倍[];

您可以直接使用它在同一行,

double[] array = ArrayUtils.toPrimitive(frameList.toArray(new Double[frameList.size()])); 
+0

重要的是要注意'ArrayUtils'是Apache庫的一部分,所以不是標準的Java:'org.apache.commons.lang3.ArrayUtils'。但無論如何這是一個很好的解決方案。 – brimborium 2017-08-17 15:15:01