如何在不使用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)
}
}
答案 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