gpt4 book ai didi

scala - 在 Scala 中映射空 ListBuffer 的默认值

转载 作者:行者123 更新时间:2023-12-04 20:18:05 24 4
gpt4 key购买 nike

我正在尝试创建一个可变的 Map使用默认值创建一个新的 ListBuffer当请求的元素不在 map 中时。但是,虽然新 map 作为默认值返回,但它不会保留在 map 中。也许这就是它的工作原理,我想,但是当我用 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) . update实际上改变了 map 。

但是ListBuffer[Int]确实有 +=方法,所以你的电话是 a(2).+=(1) ,并且您没有设置 a(2)对任何事!

关于scala - 在 Scala 中映射空 ListBuffer 的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9828156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com