2016-06-01 26 views
2

我們知道,在階,以創建二維陣列(矩陣),ofDim用於創建大量陣列的:Scala中

def ofDim[T](n1: Int, n2: Int): Array[Array[T]] 

其中參數只接受int類型。

如果我想創建一個包含大量元素的二維數組,那麼應該使用多長時間?我可以使用其他什麼方式來代替迪姆?

謝謝。

回答

6

即使您有足夠的內存來擁有超過您數據類型的2^31-1個元素,JVM也會將數組限制爲最多2^31-1的長度。

所以簡短的回答是:你不能。無論如何你可能沒有足夠的記憶。

但是,如果你這樣做,你可以創建自己的類,它包裝數組的數組作爲一個數組:

class BigArray[@specialized T: reflect.ClassTag](size: Long) { 
    private val data = Array.ofDim(1 + (size >> 20).toInt, math.min(size, 1L << 20).toInt) 
    def apply(i: Long): T = data((i >> 20).toInt)((i & ((1 << 20)-1)).toInt) 
    def update(i: Long, value: T) { 
    data((i >> 20).toInt)((i & ((1 << 20)-1)).toInt) = value 
    } 
} 

,然後用這個。請注意,試圖將大量數據放入大多數現有集合類型中都會破壞它,因此您可能只需將其索引爲舊式(手動)方式。

現在您已經擁有了這個功能,您可以創建BigArrays BigArrays並手動爲它們設置索引來放置元素(並初始化空的BigArray)。

但可能有更好的方法來解決這個問題,使您想要創建如此巨大的數組。