我在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))
答案 0 :(得分:0)
您的代码存在一些问题:
->
的优先级比+
高,因此您的代码本质上是:
(1 -> sm("abc")(1)) + 2
要执行此操作,请在圆括号内加上加号:
1 -> (sm("abc")(1) + 2)
然后它将为您提供关于(Int, Int)
的相同错误。
没有从元组(->
创建元组)进行映射的隐式转换,因此您需要使用显式构造函数。
最后,您的版本的工作代码为:
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))
使用不变地图解决此问题的另一种方法。在线上有很多教程,因此在此不再赘述。