我有一个 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/