我是scala的新手。以下示例我对发生的事情感到有些困惑。我创建了一个可变映射,然后将三个键/值推送到地图。我可以通过键检索队列的值,但是" web.keys"它显示地图是空的," web.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
我尝试了更多实验,似乎与#34; 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 :(得分:5)
从地图返回默认值时,它不会添加到地图中!所以在调用web(123)
没有添加到地图中,只返回默认值。使用getOrElseUpdate
方法读取使用默认值的地图的数据而不是。或者只是考虑到默认值不在地图中作为其他键 - 值对。
我认为你误解了你的例子:
在第一个示例web(123).enqueue(567L)
中,您正在检索默认值并将567L添加到默认值(Queue)。地图上没有添加任何内容。
在第二个示例w(1)=1
中,您要向地图添加数据
在第三个示例ww(1) += 1
中,您正在检索默认值(0)并向其添加1。
一般情况下,使用map(K)
会返回键K的值,而map(K) = V
会为键K设置值V.
在引擎盖下调用map(K)
和map(K) = V
使用apply和update方法。有关详细信息,请参阅http://otfried.org/scala/apply.html或其他scala文档。