如何更新可变映射的值,该值是主映射键的值?

时间:2020-02-11 14:28:15

标签: scala

我在Scala中有一个可变的Map,其定义如下:

scala> var sm = mutable.Map[String, mutable.Map[Int, Int]]()
sm: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map()

我有一个Map,它的另一个Map为它的值,并按如下所示将值插入其中。

scala> sm += ("abc" -> mutable.Map(1->0,0->0))
res77: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map(abc -> Map(1 -> 0, 0 -> 0))

scala> sm
res78: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map(abc -> Map(1 -> 0, 0 -> 0))

我有另一个值为0或1的文件“ abc”,我需要对其进行验证并获取0和1的计数并在映射sm中对其进行更新。 在验证它之前,我尝试更新scala REPL上的值,如下所示

scala> sm += ("abc" -> (1 -> sm("abc")(1)+1))
<console>:27: error: type mismatch;
 found   : Int(1)
 required: String
       sm += ("abc" -> (1 -> sm("abc")(1)+1))

因此,我尝试首先使用"abc"->1访问sm("abc")(1)的键,这给了我正确的值0并为其添加了一个值,该值也很好用。

scala> sm("abc")(1)+2
res90: Int = 2

但是当我在地图sm("abc")(1)上替换相同的表达式sm来更新sm("abc")(1)的值时,我看到了错误消息:

scala> sm += ("abc" -> (1 -> sm("abc")(1)+2))
<console>:27: error: type mismatch;
 found   : Int(2)
 required: String
       sm += ("abc" -> (1 -> sm("abc")(1)+2))
scala> var e = sm("abc")(1)+2
e: Int = 2

scala> sm += ("abc" -> (1 -> e ))
<console>:29: error: type mismatch;
 found   : (Int, Int)
 required: scala.collection.mutable.Map[Int,Int]
       sm += ("abc" -> (1 -> e ))

此方法sm += ("abc" -> mutable.Map(1 -> e ))有效,但是它替换了键0并导致

scala> sm += ("abc" -> mutable.Map(1 -> e ))
res93: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map(abc -> Map(1 -> 2))

我无法理解此错误消息。任何人都可以让我知道我在这里做的错误是什么,以及如何更新地图的->地图的值并获得输出

Map(abc -> Map(1 -> 2, 0 -> 0))

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

  1. ->的优先级比+高,因此您的代码本质上是:

    (1 -> sm("abc")(1)) + 2
    

    要执行此操作,请在圆括号内加上加号:

    1 -> (sm("abc")(1) + 2)
    

    然后它将为您提供关于(Int, Int)的相同错误。

  2. 没有从元组(->创建元组)进行映射的隐式转换,因此您需要使用显式构造函数。

最后,您的版本的工作代码为:

sm += ("abc" -> mutable.Map(1 -> (sm("abc")(1) + 2) ) )

但是,这不是一个好习惯。您已经将值定义为可变映射,因此无需在每次更新值时都构造新的映射。另外,您的版本还会丢失一对0 -> 0。您可以这样做:

sm("abc")(1) = sm("abc")(1) + 2

sm将是Map(abc -> Map(1 -> 2, 0 -> 0))

使用不变地图解决此问题的另一种方法。在线上有很多教程,因此在此不再赘述。