2012-10-12 14 views
13

我想使用一個不可變的索引多維數組。有意義的結構是VectorVectors。如何在Scala中創建多維向量?

scala> val v = Vector[Vector[Int]](Vector[Int](1,2,3), Vector[Int](4,5,6), Vector[Int](7,8,9)) 
v: scala.collection.immutable.Vector[Vector[Int]] = Vector(Vector(1, 2, 3), Vector(4, 5, 6), Vector(7, 8, 9)) 

這將是很好創建一個空數組只是通過指定尺寸,就像你可以與Array.ofDim

scala> a = Array.ofDim[Int](3,3) 
a: Array[Array[Int]] = Array(Array(0, 0, 0), Array(0, 0, 0), Array(0, 0, 0)) 

然而,沒有Vector.ofDim,功能,我無法找到一個等效。

是否有相當於Array.ofDim的不可變對象?如果不是,爲什麼不呢?

+0

這是一個解決Sudoku難題的程序。部分解決方案被表示爲一個nxn的'Option [Int]'數組。給定部分解決方案_p_,程序可以通過將整數放入數組來假設另一個_p'_。由於每個_p_可能會生成多個_p'_ s,我希望每個部分解決方案都是不可變的。我的選項似乎是1)代表具有私有「數組」的數字2)用「Vector」代表數字。 (2)在功能風格上似乎更多,但是創建'Vector's的'Vector's很尷尬。 –

+0

您可以使用單個維度來表示多維數組/列表。 – pedrofurla

+1

準備嘗試更新多維向量中的單元格有些樂趣。可能最簡單的是有一個實用方法:'def update [T](v:Vector [Vector [T]])(c1:Int,c2:Int)(newVal:T)= v.updated(c1,v(c1 ).updated(c2,newVal))'。或者,如果您需要從http://stackoverflow.com/a/12612908/770361複製和粘貼更高維度。 –

回答

18

每個標準集合類與工廠方法,包括fill同伴對象。舉例:

Vector.fill(3, 3)(0) 

the relevant scaladoc

+0

鏈接給出404.當前鏈接是(2016-11-25):http://www.scala-lang.org/api/current/scala/collection/immutable/Vector.html – eddy147

+0

我更新了鏈接(它是隻是嚴重被解析)。事實證明,目前的scaladoc仍然沒有提及'fill',所以我堅持使用Scala 2.9.1。 –

+0

不確定爲什麼你看不到它,但是'fill'已經存在了,並且已經有很長一段時間了:http://www.scala-lang.org/api/current/scala/collection/immutable/Vector$ .html#fill [A](n1:Int,n2:Int)(elem:=> A):CC [CC [A]]它在伴侶對象中,當然是 –

5

您可以使用fill

scala> Vector.fill(3)(Vector.fill(3)(0)) 
res1: scala.collection.immutable.Vector[scala.collection.immutable.Vector[Int]] = 
     Vector(Vector(0, 0, 0), Vector(0, 0, 0), Vector(0, 0, 0)) 
13

有一個叫tabulate創建方法,可以讓你設置基於索引的內容:

scala> Vector.tabulate(3,3){ (i,j) => 3*i+j+1 } 
res0: scala.collection.immutable.Vector[scala.collection.immutable.Vector[Int]] = 
Vector(Vector(1, 2, 3), Vector(4, 5, 6), Vector(7, 8, 9)) 

如果你只是需要零(或一些其他不變),則可以使用fill代替:

scala> Vector.fill(3,3)(0) 
res1: scala.collection.immutable.Vector[scala.collection.immutable.Vector[Int]] = 
Vector(Vector(0, 0, 0), Vector(0, 0, 0), Vector(0, 0, 0))