例如,如果我有以下元组:
(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")) )
答案 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(...)