使用scala中的空ListBuffer映射withDefault
发布时间:2020-12-16 18:37:51 所属栏目:安全 来源:网络整理
导读:我正在尝试创建一个带有默认值的可变Map,当请求的元素尚未存在于地图中时,该默认值会创建一个新的ListBuffer.但是,虽然新地图作为默认值返回,但它不会保留在地图中.也许这就是它的工作方式,我想,但是当我用Int而不是ListBuffer测试它时,它完全按照我的意愿行
我正在尝试创建一个带有默认值的可变Map,当请求的元素尚未存在于地图中时,该默认值会创建一个新的ListBuffer.但是,虽然新地图作为默认值返回,但它不会保留在地图中.也许这就是它的工作方式,我想,但是当我用Int而不是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)) 解决方法
区别在于:
在第一种情况下,a(2)是Int.由于Int不具有=方法,因此a(2)= 1等效于a(2)= a(2)1,因此等于a.update(2,a(2)1).更新实际上更改了地图. 但是ListBuffer [Int]确实有一个=方法,所以你的调用是(2). =(1),你没有设置(2)任何东西! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读