如何在Scala中使用相同的元素合并元组

时间:2013-06-04 18:54:34

标签: list scala tuples slick

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

(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")) )

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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(...)