1

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

"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

4 回答 4

2

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

var m = Map[String, Int]()
于 2013-03-24T12:17:05.277 回答
2

或使用 à mutable 数据结构,如:

scala.collection.mutable.Map

但是您将无法重新分配变量!

于 2013-03-24T13:44:57.013 回答
2

有几个选项。

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

另一种是使用递归结构,可以直接编写递归函数调用,也可以使用类似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可变映射语法通常可以导致非常简单和简洁的代码。

Scala 有意成为一种混合范式语言。我的建议是首先使用不可变的函数式方法,但不要害怕在它们使事情变得更简单时使用命令式特性——除非涉及线程。

于 2013-05-21T06:08:33.847 回答
1

您所需要的只是从 转换ArrayMap

val pairs = Array(("a", 1), ("b", 2), ("c", 3), ("d", 4))
val m = pairs.toMap
于 2013-03-24T17:14:04.960 回答