2013-06-04 10 views
9

Na przykład, jeśli mam następujące krotki:Jak połączyć krotki przez samych elementów w Scala

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

Chcę połączyć je tak:

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

w moim przypadku, list są wynikiem wewnętrznego sprzężenia za pomocą Slicka. Tak więc pierwsze i drugie elementy (1 i "a") powinny być takie same. Jeśli ktoś wie, jak scalić w ten sposób w przypadku korzystania z Slick, daj mi znać proszę.

Lub bardziej ogólnie, sposób łączenia krotek z wewnętrznymi listami tymi samymi elementami.

(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

Jakich rezultatów oczekujesz, jeśli masz przypadek z krotkami (1, "a", "m") i (2, "a", "l")? – 4lex1v

+0

@ 0__ bardzo dziękuję za modyfikowanie mojej angielskiej składni. – Outsider

Odpowiedz

8

Jak o:

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

Dzięki @ gzm0 !! właśnie tego chcę dokładnie. – Outsider

1

można spróbować 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) 

Aktualizacja

Jeśli lista nie jest posortowana wejściowe:

val result = l.sorted.foldRight(...) 
+0

To zadziała tylko wtedy, gdy wszystkie krotki są posortowane jak na powyższym przykładzie. Gdyby cztery krotki zostały ułożone w inny sposób, wówczas to rozwiązanie nie będzie pasowało. – Jatin

+0

Dane pochodzą z bazy danych, więc powinny być posortowane według bazy danych. W każdym razie, na wszelki wypadek, dodałem aktualizację. – Beryllium

+0

Nauczyłem się z twojego kodu. ale odpowiedź gzm0 jest bardziej ogólnie myślę. btw dziękuję @Beryllium. – Outsider

Powiązane problemy