Scala - 在地图上分组

时间:2014-01-14 16:30:13

标签: scala

我有一个Map[T, Map[Date, Double]]变量,我希望将其转换为Map[Date, List[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))

2 个答案:

答案 0 :(得分:4)

没有可变的集合:

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(_)}}

答案 1 :(得分:1)

您将不得不使用ListBuffer,否则可能会覆盖密钥:

val builder = MMap[Date, ListBuffer[Double]]
for{
  (_, inner) <- myNested
  (key, value) <- inner
} {
  if(builder contains key) builder(key) += value
  else builder(key) = new ListBuffer(value)
}

builder mapValues(_ result ()) toMap

其中MMap指的是可变图。