9

例如,如果我有以下元组:

(1, "a", "l")
(1, "a", "m")
(1, "a", "n")

我想像这样合并它们:

(1, "a", List("l", "m", "n"))

就我而言,这些列表是使用 Slick 进行内部连接的结果。因此,第一个和第二个元素 (1"a") 应该相同。如果有人知道在使用 Slick 的情况下如何合并,请告诉我。

或者更一般地说,通过相同元素将元组与内部列表合并的方式。

(1, "a", "l")
(1, "a", "m")
(1, "b", "n")
(1, "b", "o")
// to like this
List( (1, "a", List("l", "m")), (1, "b", List("n", "o")) )
4

2 回答 2

8

怎么样:

val l = ??? // Your list

val groups = l groupBy { case (a, b, c) => (a,b) }

val tups = groups map { case ((a,b), l) => (a,b,l.map(_._3)) }

tups.toList
于 2013-06-04T19:58:36.193 回答
1

你可以试试foldRight

val l = List((1, "a", "l"), (1, "a", "m"), (1, "a", "n"), (1, "b", "n"), (1, "b", "o"))
val exp = List((1, "a", List("l", "m", "n")), (1, "b", List("n", "o")))

val result = l.foldRight(List.empty[(Int, String, List[String])]) {
  (x, acc) =>
    val (n, s1, s2) = x

    acc match {
      case (n_, s1_, l_) :: t if (n == n_ && s1 == s1_) =>
        (n_, s1_, (s2 :: l_)) :: t

      case _ =>
        (n, s1, List(s2)) :: acc

    }
}

println(result)
println(result == exp)

更新

如果输入列表未排序:

val result = l.sorted.foldRight(...)
于 2013-06-04T19:39:08.113 回答