Scala - 在 map 的 map 上分组

标签 scala

我有一个 Map[T, Map[Date, Double]] 变量,我想把它变成 Map[Date, List[Double]] 其中日期映射到它在原始数据结构中映射到的所有 double 的列表。我很难找到正确的功能组合来获得我想要的结构。

例子:

scala> val m1 = Map("2013-01-01" -> 10, "2014-01-01" -> 20)
scala> val m2 = Map("2013-01-01" -> 100, "2014-01-01" -> 200)
scala> val m = Map(1 -> m1, 2 -> m2)

m 操作的预期结果:

Map("2013-01-01" -> List(10, 100), "2014-01-01" -> List(20, 200))

最佳答案

没有可变集合:

m.values.
  flatMap{_.seq}.
  groupBy{_._1}.
  map{ case (k, vl) => k -> vl.map{_._2}.toList }
// Map(2014-01-01 -> List(20, 200), 2013-01-01 -> List(10, 100))

您可以使用 mapValues{ _.map{_._2}.toList } 代替 map{ case (k, vl) => k -> vl.map{_。 _2}.toList },但在这种情况下,它将在每次访问值时重新评估。

使用scalaz:

import scalaz._, Scalaz._

m.values.toVector.foldMap{_.mapValues{List(_)}}

关于Scala - 在 map 的 map 上分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21118666/

相关文章:

scala - 在 Spark SQL 中的一个查询中使用多个 collect_list

scala - 如何终止 Scala Remote Actor 客户端?

Java 与 Scala 功能接口(interface)用法

java - Scalafx动画计时器导致递归: Possible to avoid that?

regex - Scala 正则表达式模式提取器

scala - 调试没有看到任何测试的 sbt 构建

function - Scala 中具有重载方法的方法和函数之间的 Eta 扩展

scala - 比较Subcut和Scaldi

scala - sbt 组件,包括我的 jar

java - IntelliJ 和 Play 框架 : "` scala-library` has broken sources path"