2014-08-31 56 views
1

我讀過關於使用ofdim在scala中創建多維數組,但如果我不想讓所有數組的大小相同? 我想要能夠製作各種大小的數組,如下所示,但一直未能找到任何東西。Scala中的多維數組數組

dist = [[1,2,3], 
     [10, 11, 13, 15, 16, 17, 19], 
     [25]] 
+0

各種長度或尺寸的數組數組? – 2014-08-31 00:30:11

+0

一組不同長度的數組,用於將物品放入箱中;就像製作直方圖一樣。 – vyruz 2014-08-31 00:57:34

回答

1

您可以隨時使用tabulate,然後建立你需要指數的基礎上的大小,或從尺寸到陣列本身的列表映射:

Array.tabulate(4)(i => Array.range(0,i)) 
// Array[Array[Int]] = Array(Array(), Array(0), Array(0, 1), Array(0, 1, 2)) 

Array(3,7,1).map(i => Array.range(0,i)) 
// Array[Array[Int]] = Array(Array(0, 1, 2), Array(0, 1, 2, 3, 4, 5, 6), Array(0)) 

的JVM沒有真正的多維數組,只是數組的數組 - 所以Scala不會。儘管你可以隨意構建它們。

+0

爲什麼當我做var hist = Array.tabulate(9)(i => Array(0))並嘗試打印hist時,我得到了類似於[[I @ 5b895cb9 – vyruz 2014-08-31 01:35:02

+0

@vyruz - 'Array'沒有' toString'方法打印其內容。 REPL將調用它自己的打印例程而不是隻調用'toString';你可以'println(hist.map(_。mkString(「,」))。mkString(「\ n」))'或者其他來查看元素。 – 2014-08-31 01:38:49

0

更好地去像這樣的數組列表[列表[Int]]。內部列表可以是可變長度,滿足您的需求。或列表列表,如果您不確定外部數組的長度。

0

如果考慮裝箱從集合值建立柱狀圖考慮重複使用的partition(見我的全力,相關的,在https://stackoverflow.com/a/24540089/3189923答案),這樣,

def histo(bounds: Array[Int], data: Array[Int]): Array[Array[Int]] = { 
    bounds match { 
    case Array(h)  => Array(data) 
    case Array(h, t @ _*) => val (l,r) = data.partition(_ < h) 
          l +: histo(t.toArray,r) 
    } 
} 

因此,對於

val bounds = Array(10, 20, 30) 
val dist = Array(1, 2, 3, 10, 11, 13, 15, 16, 17, 19, 25) 

我們有

histo(bounds, dist) 
res: Array[Array[Int]] = Array(Array(1, 2, 3), 
           Array(10, 11, 13, 15, 16, 17, 19), 
           Array(25))