scala - 为什么 map.size return 0 当地图不为空时
scala - why map.size return 0 when the map is not empty
我是 Scala 新手。下面的例子我有点困惑发生了什么。我创建了一个可变地图,然后将三个 key/value 推到地图上。我可以通过键检索具有值的队列,但是 "web.keys" 它显示地图是空的,并且 "web.size" returns 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
当默认值 return 从地图中编辑时,它不会添加到地图中!所以当调用 web(123)
没有向地图添加任何内容,只有默认值 returned。使用 getOrElseUpdate
方法读取数据 而不是 使用具有默认值的映射。或者简单地考虑默认值不在映射中,因为其他键值对。
我认为你误解了你的例子:
在第一个示例中 web(123).enqueue(567L)
您正在检索默认值并将 567L 添加到默认值(队列)。未向地图添加任何内容。
在第二个示例中 w(1)=1
您正在向地图添加数据
在第三个示例中 ww(1) += 1
您正在检索默认值 (0) 并将其加 1。
一般使用map(K)
将为键K设置return值,而map(K) = V
将为键K设置值V。
在后台调用 map(K)
和 map(K) = V
使用 apply 和 update 方法。有关详细信息,请参阅 http://otfried.org/scala/apply.html 或其他 Scala 文档。
我是 Scala 新手。下面的例子我有点困惑发生了什么。我创建了一个可变地图,然后将三个 key/value 推到地图上。我可以通过键检索具有值的队列,但是 "web.keys" 它显示地图是空的,并且 "web.size" returns 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
当默认值 return 从地图中编辑时,它不会添加到地图中!所以当调用 web(123)
没有向地图添加任何内容,只有默认值 returned。使用 getOrElseUpdate
方法读取数据 而不是 使用具有默认值的映射。或者简单地考虑默认值不在映射中,因为其他键值对。
我认为你误解了你的例子:
在第一个示例中 web(123).enqueue(567L)
您正在检索默认值并将 567L 添加到默认值(队列)。未向地图添加任何内容。
在第二个示例中 w(1)=1
您正在向地图添加数据
在第三个示例中 ww(1) += 1
您正在检索默认值 (0) 并将其加 1。
一般使用map(K)
将为键K设置return值,而map(K) = V
将为键K设置值V。
在后台调用 map(K)
和 map(K) = V
使用 apply 和 update 方法。有关详细信息,请参阅 http://otfried.org/scala/apply.html 或其他 Scala 文档。