2012-10-12 5 views
13

不変のインデックス付き多次元配列で作業したい。意味をなす構造は、VectorVectorである。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

数独パズルを解くプログラム用です。部分解は 'Option [Int]'のnxn配列として表されます。部分的な解_p_が与えられた場合、プログラムは整数を配列に入れて別の仮説を仮定することができます。各_p_は複数の_p'_を生成する可能性があるので、私は部分的な解決法を不変にしたい。私の選択肢は、1)プライベートの「配列」で数字を表現すること2)「ベクトル」で数字を表現することのいずれかになります。 (2)は機能的なスタイルのようですが、VectorのVectorを作成するのは厄介です。 –

+0

単一次元を使用して多次元配列/リストを表すことができます。 – pedrofurla

+1

多次元ベクトルのセルを更新しようとするのを楽しみましょう。おそらく最も簡単なのはユーティリティメソッドを持つことです: 'def update [T](v:Vector [Vector])(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

リンクを更新しました。ただひどくSOによって解析される)。現在の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)) 
関連する問題