我有一个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))
答案 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
指的是可变图。