修改scala地图值

时间:2017-06-09 03:58:06

标签: scala dictionary

我最近学习了scala,但在修改地图值时发现了一个问题。

    def exercise1():Map[String, Int]={
      val map = createMap()
      var newMap = map
     for((k,v) <-  map){
       newMap(k) = 2 * v;
     }
      newMap
    }

函数exercise1可以运行。但是当我改变下一行

newMap(k) = v * 2;

我发现它失败了,为什么?

1 个答案:

答案 0 :(得分:2)

我不确定createMap()函数返回什么,但我的猜测是它返回Map[String, Int]

如果这是真的,那么您的代码将失败,因为Map[String, Int]是不可变的,并且您无法使用此代码newMap(k) = 2 * v将值重新分配给不可变映射。您必须在此处使用mutable.Map[String, Int]

示例代码(在scala REPL中):

scala> val x = Map("foo" -> 1, "bar" -> 2)
x: scala.collection.immutable.Map[String,Int] = Map(foo -> 1, bar -> 2)

scala> var y: scala.collection.mutable.Map[String, Int] = scala.collection.mutable.Map(x.toSeq: _*)
y: scala.collection.mutable.Map[String,Int] = Map(foo -> 1, bar -> 2)

scala> y("foo") = 3

scala> y
res2: scala.collection.mutable.Map[String,Int] = Map(foo -> 3, bar -> 2)

但是,你需要的只是一张新地图,所有值都加倍,你可以这样做:

x.map { case (k, v) => k -> 2 * v }