Scala地图更新

Raj*_* Gr 1 scala

我想更新另一个地图中存在的地图值。当我尝试更新时说“值更新不是Option [scala.collection.immutable.Map [Int,Int]]的成员”。

我尝试将值转换为Map,但仍然对我不起作用。

  val map = Map("one" -> Map(1 -> 11), "two" -> Map(2 -> 22))
  val value = map1.get("one")
  value(1) = 100  //value update is not a member of Option[scala.collection.Map[Int,Int]]
Run Code Online (Sandbox Code Playgroud)

sah*_*heb 5

您正在犯两个错误。

  1. 在地图上调用get将返回一个Option,因此您无法设置该值。

  2. 当您的操作/目的是更新某些键的值时,您正在使用不可变映射,为此您需要使用可变映射。

让我们尝试编写一些代码片段来解决这两个问题。

scala> val map = Map("one" -> Map(1 -> 11), "two" -> Map(2 -> 22))
map: scala.collection.immutable.Map[String,scala.collection.immutable.Map[Int,Int]] = Map(one -> Map(1 -> 11), two -> Map(2 -> 22))

scala> val valueOption = map.get("one")
valueOption: Option[scala.collection.immutable.Map[Int,Int]] = Some(Map(1 -> 11))

scala> val value = map("one")
value: scala.collection.immutable.Map[Int,Int] = Map(1 -> 11)

scala> value(1) = 100
<console>:13: error: value update is not a member of scala.collection.immutable.Map[Int,Int]
       value(1) = 100
Run Code Online (Sandbox Code Playgroud)

您应该注意到.get使用括号和直接使用括号获取值之间的区别。这是一个更容易理解的错误,无需了解下面发生的Scala魔术。

现在,如果在导入可变Map之后重复相同的语句,您将能够获得想要实现的目标。

scala> import scala.collection.mutable.Map
import scala.collection.mutable.Map

scala> val map = Map("one" -> Map(1 -> 11), "two" -> Map(2 -> 22))
map: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map(one -> Map(1 -> 11), two -> Map(2 -> 22))

scala> val value = map("one")
value: scala.collection.mutable.Map[Int,Int] = Map(1 -> 11)

scala> value(1) = 100

scala> map
res2: scala.collection.mutable.Map[String,scala.collection.mutable.Map[Int,Int]] = Map(one -> Map(1 -> 100), two -> Map(2 -> 22))
Run Code Online (Sandbox Code Playgroud)