2012-03-22 72 views
5

我試圖創建一個可變的Map,默認情況下,當一個元素被請求時,它不會在地圖中創建一個新的ListBuffer。但是,當新地圖返回爲默認地圖時,它不會保留在地圖中。也許這就是它的工作方式,我想,但是當我用Int而不是ListBuffer進行測試時,它的確如我所願。這裏有一些代碼來解釋我的意思 - 我做錯了什麼?默認情況下在斯卡拉映射一個空的ListBuffer

首先,這裏正在與Map[Int]

scala> val a = collection.mutable.Map(1 -> 1).withDefault(i => 0) 
a: scala.collection.mutable.Map[Int,Int] = Map(1 -> 1) 

scala> a(1) += 1 // adding to an existing element works as expected 

scala> a 
res48: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2) 

scala> a(2) += 1 // what about adding to a non-existing element? 

scala> a // the new element has been added to the map 
res50: scala.collection.mutable.Map[Int,Int] = Map(1 -> 2, 2 -> 1) 

現在有Map[ListBuffer[Int]]

scala> val b = collection.mutable.Map(1 -> collection.mutable.ListBuffer[Int]()).withDefault(i => collection.mutable.ListBuffer.empty[Int]) 
b: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] = Map(1 -> ListBuffer()) 

scala> b(1) += 1 // appending to an existing element works as expected 
res51: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1) 

scala> b 
res52: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] = Map(1 -> ListBuffer(1)) 

scala> b(2) += 1 // but appending to a non-existing element... 
res53: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1) 

scala> b // leaves the map unchanged 
res54: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] = Map(1 -> ListBuffer(1)) 

回答

3

的區別是:

在第一種情況下a(2)Int 。由於Int沒有+=方法,因此a(2) += 1等效於a(2) = a(2) + 1等,a.update(2, a(2) + 1)update實際上改變了地圖。

ListBuffer[Int]確實+=方法,讓您的來電是a(2).+=(1),並且不設置a(2)任何東西!

+0

偉大的,這是有道理的 - 那麼我該如何解決它?我是否需要通過三行來完成,獲取元素,追加到它,然後設置它?因爲如果可能的話我寧願避免! – Russell 2012-03-22 19:02:26

+0

我想我可以做地圖(我)=地圖(我)+ = 5,但它看起來很蹩腳。 – Russell 2012-03-22 19:05:35

+1

是的,我認爲是這樣的(當然,你總是可以將它解釋爲一個好幫手方法)。 – 2012-03-22 19:17:40

1

您可以使用getOrElseUpdate(key: A, op: => B)您可以創建一個ListBuffer的新實例,當密鑰不存在時。

E.g.

val m = collection.mutable.Map[Int, ListBuffer[Int]]() 
m.getOrElseUpdate(1, ListBuffer()) += 1 
+0

+1,因爲雖然這可能有點刺激和冗長的寫作,*意圖*更清晰。 – Russell 2012-03-22 21:54:38