如何在Scala中创建多维向量?

W.P*_*ill 13 scala scala-collections

我想使用不可变的索引多维数组.这是有道理的结构是VectorVector秒.

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))
Run Code Online (Sandbox Code Playgroud)

只需指定尺寸就可以创建一个空数组,这是很好的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))
Run Code Online (Sandbox Code Playgroud)

但是,没有Vector.ofDim,功能,我找不到相应的.

是否有相当于Array.ofDim不可变对象?如果没有,为什么不呢?

Rég*_*les 20

每个标准集合类都有一个带有工厂方法的伴随对象,包括fill.举例:

Vector.fill(3, 3)( 0 )
Run Code Online (Sandbox Code Playgroud)

参见相关的scaladoc.


Rex*_*err 14

有一个名为的创建方法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))
Run Code Online (Sandbox Code Playgroud)

如果你只需要零(或其他常量),你可以使用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))
Run Code Online (Sandbox Code Playgroud)


par*_*tic 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))
Run Code Online (Sandbox Code Playgroud)