我有以下输入数据
((A, 1, 4), (A, 2, 5), (A, 3, 6))
我想产生以下结果
(A, (1, 2, 3), (4, 5, 6))
通过按键分组输入
在Scala中这样做的正确方法是什么?
答案 0 :(得分:5)
<(>(A,1,4),(A,2,5),(A,3,6))
如果这代表List[(String, Int, Int)]
类型,请尝试以下操作。
val l = List(("A", 1, 4), ("A", 2, 5), ("A", 3, 6), ("B", 1, 4), ("B", 2, 5), ("B", 3, 6))
l groupBy {_._1} map {
case (k, v) => (k, v map {
case (k, v1, v2) => (v1, v2)
} unzip)
}
这将产生Map[String,(List[Int], List[Int])]
,即,一个字符串键映射到两个列表的元组。
地图(A - &gt;(列表(1,2,3),列表(4,5,6)),B - &gt;(列表(1,2,3),列表(4,5,6) )))
答案 1 :(得分:0)
尝试这样的事情:
def takeHeads[A](lists:List[List[A]]): (List[A], List[List[A]]) =
(lists.map(_.head), lists.map(_.tail))
def translate[A](lists:List[List[A]]): List[List[A]] =
if (lists.flatten.isEmpty) Nil else {
val t = takeHeads(lists)
t._1 :: translate(t._2)
}
yourValue.groupBy(_.head).mapValues(v => translate(v.map(_.tail)))
这会在你的价值上使用时产生一个Map [Any,Any] ......但它应该让你朝着正确的方向前进。