List 如何在Scala中按相同元素合并元组

List 如何在Scala中按相同元素合并元组,list,scala,tuples,slick,List,Scala,Tuples,Slick,例如,如果我有以下元组: (1, "a", "l") (1, "a", "m") (1, "a", "n") 我想这样合并它们: (1, "a", List("l", "m", "n")) 在我的例子中,这些列表是使用Slick进行内部连接的结果。 因此,第一个和第二个元素(1和“a”)应该是相同的。 如果有人知道如何合并这样的情况下使用滑头,请让我知道 或者更一般地说,通过相同元素将元组与内部列表合并的方法 (1, "a", "l") (1, "a", "m") (1, "b", "n")

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

(1, "a", "l")
(1, "a", "m")
(1, "a", "n")
我想这样合并它们:

(1, "a", List("l", "m", "n"))
在我的例子中,这些列表是使用Slick进行内部连接的结果。 因此,第一个和第二个元素(
1
“a”
)应该是相同的。 如果有人知道如何合并这样的情况下使用滑头,请让我知道

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

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

您可以尝试
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(...)
那么:

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

只有当所有元组都像上面的示例那样排序时,这才有效。如果四个元组以不同的方式排列,那么这个解决方案将不匹配来自数据库的数据,因此它应该按数据库排序。无论如何,以防万一,我添加了一个更新。我从你的代码中学到了。但我认为gzm0的答案更一般。顺便说一句,谢谢你,铍。不客气,没关系。我同意这是一种更普遍的方式。如果您有大量的行,并且您迟早会进行排序,那么总会有
foldRight
。可能会感兴趣,这是我学习foldRight的地方。如果你有(1,“a”,“m”)和(2,“a”,“l”)元组的情况,你期望得到什么结果?