2017-05-25 250 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))