gpt4 book ai didi

scala - 从 Scala 的 HashMap.mapValues 获取 HashMap?

转载 作者:行者123 更新时间:2023-12-01 10:32:37 25 4
gpt4 key购买 nike

下面的示例是我从较大的应用程序中提取的独立示例。

下面调用mapValues后有没有更好的方法得到一个HashMap?我是 Scala 的新手,所以很可能我做错了这一切,在这种情况下,请随意提出一种完全不同的方法。 (一个明显的解决方案是将 mapValues 中的逻辑移动到 accum 内部,但这在较大的应用程序中会很棘手。)

#!/bin/sh
exec scala "$0" "$@"
!#

import scala.collection.immutable.HashMap

case class Quantity(val name: String, val amount: Double)

class PercentsUsage {
type PercentsOfTotal = HashMap[String, Double]

var quantities = List[Quantity]()

def total: Double = (quantities map { t => t.amount }).sum

def addQuantity(qty: Quantity) = {
quantities = qty :: quantities
}

def percentages: PercentsOfTotal = {
def accum(m: PercentsOfTotal, qty: Quantity) = {
m + (qty.name -> (qty.amount + (m getOrElse (qty.name, 0.0))))
}
val emptyMap = new PercentsOfTotal()

// The `emptyMap ++` at the beginning feels clumsy, but it does the
// job of giving me a PercentsOfTotal as the result of the method.
emptyMap ++ (quantities.foldLeft(emptyMap)(accum(_, _)) mapValues (dollars => dollars / total))
}
}

val pu = new PercentsUsage()

pu.addQuantity(new Quantity("A", 100))
pu.addQuantity(new Quantity("B", 400))

val pot = pu.percentages
println(pot("A")) // prints 0.2
println(pot("B")) // prints 0.8

最佳答案

与其使用可变的HashMap 来构建您的Map,不如使用内置的scala 集合groupBy功能。这会创建一个从分组属性到该组中值列表的映射,然后可以将其聚合,例如通过求和:

def percentages: Map[String, Double] = {
val t = total
quantities.groupBy(_.name).mapValues(_.map(_.amount).sum / t)
}

此管道转换您的 List[Quantity] => Map[String, List[Quantity]] => Map[String, Double] 给你想要的结果。

关于scala - 从 Scala 的 HashMap.mapValues 获取 HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20613982/

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