scala – 为什么map.size在地图不为空时返回0
发布时间:2020-12-16 18:09:48 所属栏目:安全 来源:网络整理
导读:我是斯卡拉的新手.以下示例我对发生的事情感到有些困惑.我创建了一个可变映射,然后将三个键/值推送到地图.我可以通过键检索队列的值,但“web.keys”表示地图为空,“web.size”返回0!为什么会这样,我该如何检索正确的地图大小? scala import scala.collecti
我是斯卡拉的新手.以下示例我对发生的事情感到有些困惑.我创建了一个可变映射,然后将三个键/值推送到地图.我可以通过键检索队列的值,但“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 我尝试了更多实验,似乎与“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 解决方法
从地图返回默认值时,它不会添加到地图中!所以在调用web(123)时
没有添加到地图,只返回默认值.使用getOrElseUpdate方法读取数据而不是使用具有默认值的map.或者只是考虑到默认值不在地图中作为其他键 – 值对. 我认为你误解了你的例子: 在第一个示例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文档. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |