如何从SCALA中的三元组列表创建多图?

时间:2015-09-18 14:17:53

标签: scala

假设我有一个tuple3 List [(A,B,C)]的列表。将它转换为多图的最佳方法是什么,它映射Map [A​​,Map [B,List [C]]]?

我知道如何使用Tuple2,但如何使用Tuple3

3 个答案:

答案 0 :(得分:3)

我唯一的建议是使用.mapValues(_.代替.map(x => x._1 -> x._2.

list.groupBy(_._1).mapValues(_.groupBy(_._2).mapValues(_.map(_._3)))

答案 1 :(得分:1)

不短,但可能更清楚:

一些测试数据:

val x = List(('a', 1, 2.0), ('a', 2, 3.0), ('a', 1, 6.0), ('b', 3, 4.0), ('c', 4, 5.0))

定义一个函数,从元组创建一个映射,为每个键创建值列表:

def makeMergedMap[A,B](xs:List[(A, B)]) = xs.groupBy(_._1).mapValues(_.map(_._2))

重新映射输入元组以生成对

val y=x.map(e=>(e._1, (e._2, e._3)))
//  List((a,(1,2.0)), (a,(2,3.0)), (a,(1,6.0)), (b,(3,4.0)), (c,(4,5.0)))

现在合并映射外部元组,然后合并映射结果中的每个值。

makeMergedMap(y).mapValues(makeMergedMap(_)) 

// Map(b -> Map(3 -> List(4.0)),
//     a -> Map(2 -> List(3.0), 1 -> List(2.0, 6.0)),
//     c -> Map(4 -> List(5.0)))

答案 2 :(得分:0)

好的,我设法用

做到了
list.groupBy(_._1).map(x => x._1 -> x._2.groupBy(_._2).mapValues(_.map(_._3)))

如果你的答案较短,那么欢迎你