gpt4 book ai didi

scala - 如何访问/初始化和更新可变映射中的值?

转载 作者:行者123 更新时间:2023-12-03 03:59:03 24 4
gpt4 key购买 nike

考虑使用可变映射来跟踪出现次数/计数的简单问题,即:

val counts = collection.mutable.Map[SomeKeyType, Int]()

我目前增加计数的方法是:

counts(key) = counts.getOrElse(key, 0) + 1
// or equivalently
counts.update(key, counts.getOrElse(key, 0) + 1)

这在某种程度上感觉有点笨拙,因为我必须指定 key 两次。在性能方面,我还希望 key 必须在 map 中定位两次,这是我想避免的。有趣的是,如果Int提供某种机制来修改自身,则不会发生这种访问和更新问题。从 Int 更改为提供 increment 函数的 Counter 类将允许:

// not possible with Int
counts.getOrElseUpdate(key, 0) += 1
// but with a modifiable counter
counts.getOrElseUpdate(key, new Counter).increment

不知何故,我总是期望可变映射具有以下功能(有点类似于 transform 但不返回新集合并且在具有默认值的特定键上):

// fictitious use
counts.updateOrElse(key, 0, _ + 1)
// or alternatively
counts.getOrElseUpdate(key, 0).modify(_ + 1)

但是据我所知,这样的功能并不存在。一般来说(性能和语法方面)拥有这样的 f: A => A 就地修改可能性不是有意义吗?也许我只是在这里遗漏了一些东西......我想一定有一些更好的解决方案来解决这个问题,使得这样的功能变得不必要?

更新:

我应该澄清一下,我知道 withDefaultValue,但问题仍然相同:执行两次查找仍然比一次慢两倍,无论它是否是否是 O(1) 操作。坦率地说,在许多情况下,我非常乐意实现因子 2 的加速。显然,修改闭包的构造通常可以移到循环之外,所以恕我直言,与运行不必要的操作两次。

最佳答案

您可以使用默认值创建 map ,这将允许您执行以下操作:

scala> val m = collection.mutable.Map[String, Int]().withDefaultValue(0)
m: scala.collection.mutable.Map[String,Int] = Map()

scala> m.update("a", m("a") + 1)

scala> m
res6: scala.collection.mutable.Map[String,Int] = Map(a -> 1)

正如 Impredicative 提到的, map 查找速度很快,所以我不用担心 2 次查找。

更新:

正如 Debilski 指出的,您可以通过执行以下操作更简单地做到这一点:

scala> val m = collection.mutable.Map[String, Int]().withDefaultValue(0)
scala> m("a") += 1
scala> m
res6: scala.collection.mutable.Map[String,Int] = Map(a -> 1)

关于scala - 如何访问/初始化和更新可变映射中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15505048/

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