2013-06-04 13 views
9

Per esempio, se ho le seguenti tuple:come unire tuple di stessi elementi a Scala

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

voglio unirle in questo modo:

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

Nel mio caso, le liste sono il risultato di un join interno che usa Slick. Quindi, il primo e il secondo elemento (1 e "a") dovrebbero essere gli stessi. Se qualcuno sa come unire in questo modo in caso di utilizzo di Slick, fammi sapere per favore.

O più in generale, il modo di unire le tuple con le liste interne con gli stessi elementi.

(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

Quale risultato ti aspetti se hai un caso con (1, "a", "m") e (2, "a", "l") tuple? – 4lex1v

+0

@ 0__ grazie per aver modificato la mia sintassi inglese. – Outsider

risposta

8

ne dite:

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

Grazie @ gzm0 !! questo è quello che voglio esattamente. – Outsider

1

Si potrebbe provare 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) 

Aggiornamento

Se la lista di input non è ordinato:

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

Funziona solo se tutte le tuple sono ordinate come nell'esempio sopra. Se le quattro tuple fossero state disposte in modo diverso, questa soluzione non corrisponderebbe a – Jatin

+0

I dati provengono da un database, quindi dovrebbero essere ordinati dal database. Ad ogni modo, nel caso, ho aggiunto un aggiornamento. – Beryllium

+0

Ho imparato dal tuo codice. ma la risposta di gzm0 è più in generale penso. Grazie a voi @Beryllium. – Outsider

Problemi correlati