Scala:递归添加到不可变映射?

时间:2013-03-24 12:12:11

标签: scala map immutability

如何在不使用vars的情况下添加到不可变地图?如何 绑定 不可变为新值?尝试以下代码时出现错误:

"reassignment to val"

我的代码:

object Play {

  def main(args: Array[String]): Unit = {
          test1()
  }

  def test1() {
val pairs = Array(("a", 1), ("b", 2), ("c", 3), ("d", 4))
val m = Map[String, Int]()

for (x <- pairs) {
    m = addToMap (x, m)
}
  }

  def addToMap(pair: (String, Int), map: Map[String, Int]): Map[String, Int] = {
      map + (pair._1 -> pair._2)
  }

}

4 个答案:

答案 0 :(得分:2)

如果要重新分配不可变映射,则需要将其设为var:

var m = Map[String, Int]()

答案 1 :(得分:2)

或使用à可变数据结构,如:

scala.collection.mutable.Map

但是你无法重新分配变量!

答案 2 :(得分:2)

有几个选择。

最常见的方法是在构建结构时使用var。这通常是最简单,最易读的方法

另一种方法是使用递归结构,通过直接编写递归函数调用或使用fold之类的函数。 (我通常建议您使用折叠和贴图等标准函数,而不是自己进行迭代。)

另一个有用的习惯用法是使用toMap之类的东西。对于像你这样拥有现有数组的情况,已经提到过这一点,但它也可以与foreach循环(或等效函数)结合使用。例如,

( for (x <- xs)
  yield (toKey(x), toVal(y))
).toMap

如果值是静态的,你也可以这样做。

Map("a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4)

就个人而言,当我只是使用临时的本地地图时,我发现一张可变的地图通常是最合适的。了解如何以功能方式执行操作非常有价值,我认为每个人都应该学习Haskell,但Scala的m(x) = y可变映射语法通常会导致极其简单的&amp;简洁的代码。

Scala故意是一种混合范式语言。我的建议是首先考虑不可变的,功能性的方法,但是当它们使事情变得简单时不要害怕使用命令性功能 - 除非涉及线程。

答案 3 :(得分:1)

您需要的只是从Array转换为Map

val pairs = Array(("a", 1), ("b", 2), ("c", 3), ("d", 4))
val m = pairs.toMap