Scala - groupBy将值映射到列表

时间:2015-09-17 20:15:06

标签: scala

我有以下输入数据

((A, 1, 4), (A, 2, 5), (A, 3, 6))

我想产生以下结果

(A, (1, 2, 3), (4, 5, 6))

通过按键分组输入

在Scala中这样做的正确方法是什么?

2 个答案:

答案 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 [A​​ny,Any] ......但它应该让你朝着正确的方向前进。