gpt4 book ai didi

scala - 在Scala中,我该如何做相当于SQL SUM和GROUP BY?

转载 作者:行者123 更新时间:2023-12-03 13:09:28 27 4
gpt4 key购买 nike

例如,假设我有

val list: List[(String, Double)]

有值(value)观
"04-03-1985", 1.5
"05-03-1985", 2.4
"05-03-1985", 1.3

我如何产生新 list
"04-03-1985", 1.5
"05-03-1985", 3.7

最佳答案

这是一线。除非确实将这些高阶函数的类型内部化,否则它不是特别可读。

val s = Seq(("04-03-1985" -> 1.5),
("05-03-1985" -> 2.4),
("05-03-1985" -> 1.3))

s.groupBy(_._1).mapValues(_.map(_._2).sum)
// returns: Map(04-03-1985 -> 1.5, 05-03-1985 -> 3.7)

另一种方法是使用折叠一对一地添加键值对,
s.foldLeft(Map[String, Double]()) { case (m, (k, v)) =>
m + (k -> (v + m.getOrElse(k, 0d)))
}

我认为,理解力最强的途径是
var m = Map[String, Double]()
for ((k, v) <- s) {
m += k -> (v + m.getOrElse(k, 0d))
}

也许使用Scalaz的Map的monoid类型类可以做得更好。

请注意,您可以使用 Map[K, V]Seq[(K, V)]方法在 toSeqtoMap之间转换。

更新。经过更多考虑之后,我认为自然抽象将是类型的“多图”转换,
def seqToMultimap[A, B](s: Seq[(A, B)]): Map[A, Seq[B]]

在个人图书馆中使用适当的隐式扩展,然后可以编写:
s.toMultimap.mapValues(_.sum)

我认为这是最清晰的!

关于scala - 在Scala中,我该如何做相当于SQL SUM和GROUP BY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7142514/

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