2013-06-04 122 views
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"))) 
+0

如果你有(1,「a」,「m」)和(2,「a」,「l」)元組的情況,你會得到什麼結果? – 4lex1v

+0

@ 0__非常感謝您修改我的英語語法。 – Outsider

回答

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 
+0

謝謝@ gzm0 !!這正是我想要的。 – Outsider

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(...) 
+0

這將只工作是所有的元組排序像上面的例子。如果四個元組以不同的方式排列,那麼這個解決方案不會匹配 – Jatin

+0

數據來自數據庫,所以它應該按照數據庫排序。無論如何,以防萬一,我已經添加了更新。 – Beryllium

+0

我從你的代碼中學到了東西。但gzm0的答案更普遍我認爲。順便謝謝你@Beryllium。 – Outsider