加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用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)任何东西!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读