我有一个元组列表:
val t = List( (1,2,1.0), (1,3,2.0), (1,2,1.1) )
我想创建一个以t._1
作为键,以t._2
为键,t._3
数量总和为值的映射。
val m = Map( (1-> Map((2 -> 2.1), (3 -> 2.0)) )
我该如何在Scala中实现这个功能?
我希望使用纯Scala实现而不是库,但如果像scalaz等库提供了(从我的主观角度来看)更好的解决方案,我也会接受该答案。
我有一个元组列表:
val t = List( (1,2,1.0), (1,3,2.0), (1,2,1.1) )
我想创建一个以t._1
作为键,以t._2
为键,t._3
数量总和为值的映射。
val m = Map( (1-> Map((2 -> 2.1), (3 -> 2.0)) )
如果你喜欢一句话语的表达方式,那么你可能会喜欢这个:
val t = List( (1,2,1.0), (1,3,2.0), (1,2,1.1) )
t.groupBy(_._1).mapValues(_.groupBy(_._2).mapValues(_.map(_._3).sum))
结果是:
Map(1 -> Map(2 -> 2.1, 3 -> 2.0))
以下是一种方法:
t.groupBy(_._1).map {
case (outerKey, outerList) =>
outerKey -> outerList.groupBy(_._2).map {
case (innerKey, innerList) =>
innerKey -> innerList.map(_._3).sum
}
}
Map(1 -> Map(2 -> 2.1, 3 -> 2.0))