2017-05-25 198 views
0

我想更新另一个地图中存在的地图值。当我尝试更新时说'值更新不是选项[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]] 
+2

您不能更新_immutable_贴图,如消息所示。明确使用可变映射或创建更新副本。 – 9000

+2

你会在这里得到答案,向你展示如何获得可变映射,但我也建议习惯使用不可变数据结构。当与Scala一起工作时,通常首选拥有不可变值的函数,并创建一个接受一个值并返回另一个值的函数,而不是就地修改变量。 – Metropolis

回答

2

有你正在两个错误。

  1. 调用get一个Map将返回一个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 

你应该注意到获得使用.get的价值,并直接使用括号之间的差异。这是一个更容易理解的错误,不需要理解下面发生的Scala魔法。

现在,如果您在导入可变映射后重复相同的语句,您将能够获得您想要实现的内容。

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)) 
+0

谢谢。我是斯卡拉新手。我之前尝试使用不可变的映射,但因为我使用map.get它不允许我更新值。 –

0

当你创建你第一次map它已经immutable不能改变

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)) 

你的第二个命令再次返回的OptionimmutableMap并不能太更新。

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

由于chunjef建议,你应该使用mutableMap

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