2013-01-20 132 views
1

我想從整數構建一個可變映射到斯卡拉可變集整數。斯卡拉嵌套收集任務

例如,我想要有形式1 - >(2,3)的映射,並能夠稍後使用鍵值更新 。我使用的代碼如下:

import scala.collection.mutable._ 

val map = Map[Int, Set[Int]]() 
map: scala.collection.mutable.Map[Int,scala.collection.mutable.Set[Int]] = Map() 

map += (1 -> Set(2,3)) 
res15: map.type = Map(1 -> Set(2, 3)) 

到目前爲止很好,但是當我嘗試做一些像

map.get(1) += 4 

我得到一個分配給VAL錯誤。令我困惑的是map.get()應該返回一個 可以更新的類型scala.collection.mutable.Set的集合。有人可以擺脫一些 光在這裏發生了什麼?

+0

你應該接受一些問題的答案的,順便說一句:) – fresskoma

回答

3

在這種情況下的問題是,get()返回一個選項(Option[scala.collection.mutable.Set[Int]]),你需要「解壓」:

map.get(1).get += 4 

原因地圖的get()函數返回一個選項是,有可能不是一個值對於任何給定的鍵,Scala不喜歡拋出像Java API對應的異常。

另外,您可以使用apply()方法,直接返回所請求的值,並在發生故障時拋出異常:

map(1) += 4 

我還沒有完全想通了,爲什麼你會得到一個儘管如此,用你嘗試過的代碼「重新分配val」錯誤。在我的情況下(斯卡拉2.10),它說以下內容:

<console>:12: error: value += is not a member of Option[scala.collection.mutable.Set[Int]] 
      map.get(1) += 1 

您正在使用哪個版本的Scala?

+0

謝謝!很好的答案。我在2.9.2上。現在我也有一個很好的理由來升級。 – Wickoo

+0

另一個問題涉及到我的上一個: 如果我定義集合爲var map = Map [Int,Set [Int]](), 這次用不可變集合但是var,我得到錯誤 reassignment to val(我仍然在斯卡拉2.9.2),當我嘗試類似map(1)+ = 4的東西。我認爲這是因爲Set [Int]是不可變的。 您是否知道這種情況的任何解決方法? – Wickoo

+0

'Seq'甚至沒有'+ ='方法。在任何情況下,您都無法將任何內容添加到不可變的數據結構中,並且如果您找到了解決方法,那將是一個錯誤,應該儘快修復,因爲在很多情況下,當使用不可變的數據結構時,你就是不可變的。 – fresskoma

0

更優雅的方式是

map.get(1).map(_ += 4).getOrElse{map += 1 -> Seq(4)}