Scala使用填充或制表可变条目

时间:2013-11-16 20:44:08

标签: scala vector mutable

以下生成不可变向量的向量:

var darr = Vector.tabulate(2, 3){ (a,b) => a*2+b }
darr: scala.collection.immutable.Vector[scala.collection.immutable.Vector[Int]] = Vector(Vector(0, 1, 2), Vector(2, 3, 4))

但我们的用例需要的是 mutable Vectors的Vector。怎么办?

2 个答案:

答案 0 :(得分:6)

只需对tabulate进行嵌套调用,内部调用位于可变序列上,如Buffer

import collection.mutable.Buffer
Vector.tabulate(2)(a => Buffer.tabulate(3)(b => a*2+b))
// Vector(ArrayBuffer(0, 1, 2), ArrayBuffer(2, 3, 4))

2D tabulate实际上只是嵌套tabulate的语法糖:

// From GenTraversableFactory
def tabulate[A](n1: Int, n2: Int)(f: (Int, Int) => A): CC[CC[A]] =
  tabulate(n1)(i1 => tabulate(n2)(f(i1, _)))

答案 1 :(得分:1)

如果您的集合保持相同的大小并且您想要的是可变条目,那么我认为使用2D阵列可能是一个很好的解决方案。另外,Scala中的Array对象提供了创建1D到5D数组的tabulate方法。我需要做的就是将原始示例中的单词Vector更改为Array并且它可以正常工作:

scala> var darr = Array.tabulate(2, 3){ (a,b) => a*2+b }
darr: Array[Array[Int]] = Array(Array(0, 1, 2), Array(2, 3, 4))