gpt4 book ai didi

scala (scanLeft) - 如何(在功能上)获取具有累积值/频率的 map

转载 作者:行者123 更新时间:2023-12-01 09:45:50 26 4
gpt4 key购买 nike

我是 Scala 的新手,并试图从带有单个 Map 的 Map 中获取具有累积频率作为值的 Map。因此(对于保持顺序的不可变 Map,例如 ListMap)value(i) 是原始 Map 中直到并包括 i 的所有值的总和,如下所示:

val map = ListMap(0.0 -> 0.1, 0.01 -> 0.2, 0.05 -> 0.3, 0.1 -> 0.4)
val resultMap = ListMap(0.0 -> 0.1, 0.01 -> 0.3, 0.05 -> 0.6, 0.1 -> 1.0)

由于需要访问以前的键值对,我想出了一个迭代实现,它使用 mutable.LinkedHashMap 和运行总数,但我发现这很困惑,仍在寻找一种方法来获得来自不可变映射的可变映射(如下面的第 3 行):

var cummulativeMap0 = mutable.LinkedHashMap.empty[Double, Double]
var total = 0.0
//line3:
val copyMap = mutable.LinkedHashMap(0.0->0.1, 0.01->0.2, 0.05->0.3, 0.1->0.4)
map.foreach {
(kv) => {
total = total + copyMap.remove(kv._1).get
cummulativeMap0.put(kv._1 , total)
}
}
cummulativeMap0

另外,我也可以使用 scanLeft,但只需要将键和值拆分为 2 个列表以便稍后压缩:

val cummValues = map.values.scanLeft(0.0){ (a, b)=>a+b }.tail
val cummmulativeMap2 = (map.keys zip cummValues).toMap

实现这一点的最惯用/最实用的方法是什么,直接在 map 上使用 scanLeft 是否可行?请帮忙

最佳答案

我相信您可以使用初始值中的虚拟键扫描 map 元素:

val result = map.scanLeft((0.0, 0.0)){case ((_, av),(bk,bv)) => (bk, av + bv)}.tail

关于scala (scanLeft) - 如何(在功能上)获取具有累积值/频率的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49029327/

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