2017-10-13 148 views
4

我是scala的新手。下面的例子我有點困惑發生了什麼事情。我創建了一個可變的地圖,然後將三個鍵/值推入地圖。我可以通過鍵值檢索隊列,但「web.keys」顯示地圖是空的,「web.size」返回0!爲什麼是這樣,以及我如何檢索正確的地圖大小?scala - 爲什麼map.size在地圖不爲空時返回0

scala> import scala.collection.mutable.{Map, Set, Queue, ArrayBuffer} 

scala> val web = Map[Int, Queue[Long]]().withDefaultValue(Queue()) 
web: scala.collection.mutable.Map[Int,scala.collection.mutable.Queue[Long]] = Map() 

scala> web(123).enqueue(567L) 

scala> web(123).enqueue(1L) 

scala> web(123).enqueue(2L) 

scala> web(123) 
res96: scala.collection.mutable.Queue[Long] = Queue(567, 1, 2) 

scala> web 
res97: scala.collection.mutable.Map[Int,scala.collection.mutable.Queue[Long]] = Map() 

scala> web.size 
res98: Int = 0 

scala> web.keys 
res99: Iterable[Int] = Set() 

一個簡單的地圖工作正常。

scala> val w= Map[Int,Int]() 
w: scala.collection.mutable.Map[Int,Int] = Map() 

scala> w(1)=1 

scala> w 
res10: scala.collection.mutable.Map[Int,Int] = Map(1 -> 1) 

scala> w(2)=2 

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

scala> w.size 
res13: Int = 2 

我想更多的實驗,似乎它是與「withDefaultValue」。但是,我該如何解決它?

scala> val ww= Map[Int,Int]().withDefaultValue(0) 
ww: scala.collection.mutable.Map[Int,Int] = Map() 

scala> ww 
res14: scala.collection.mutable.Map[Int,Int] = Map() 

scala> ww(1) += 1 

scala> ww(2) += 2 

scala> w.size 
res17: Int = 0 
+0

可能的重複[爲什麼我的地圖聲明在添加密鑰後沒有密鑰?](https://stackoverflow.com/questions/44532916/why-does-my-map-claim-to-have-no- keys-after-adding-keys)或[withDefaultValue在mutable.Map中的行爲](https://stackoverflow.com/q/46650121/1048572) – Bergi

回答

5

當從地圖返回默認值時,它不會被添加到地圖!因此,當調用web(123)

沒有任何內容添加到映射中,只返回默認值。使用getOrElseUpdate方法讀取數據而不是使用默認值的映射。或者只是考慮到默認值不在其他鍵 - 值對中。

我想你是誤會你的例子:

在第一個例子web(123).enqueue(567L)你retrieveing默認值,並添加567L爲默認值(隊列)。什麼都沒有添加到地圖。

在第二個例子中w(1)=1要添加數據映射

在第三示例ww(1) += 1要檢索默認值(0),並加入1到它。

通常使用map(K)將用於密鑰K返回值,而map(K) = V將設置值V爲鍵K.

引擎蓋下調用map(K)map(K) = V用途應用和更新的方法。有關更多詳細信息,請參閱http://otfried.org/scala/apply.html或其他scala文檔。

+0

謝謝!我懂了。我認爲它會像python defaultdict一樣工作。 – user1269298

+1

只是爲了強調(當我看到這一點時,這讓我感到困惑)。如果你想做網頁(124),你仍然會得到入隊默認值。默認值是您正在更改的可變隊列。 –