2013-06-04 29 views
9

Ví dụ, nếu tôi có các bộ sau:Làm thế nào để hợp nhất các bộ bởi cùng một yếu tố trong Scala

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

Tôi muốn kết hợp chúng như thế này:

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

Trong trường hợp của tôi, danh sách là kết quả từ việc tham gia bên trong bằng cách sử dụng Slick. Vì vậy, các yếu tố đầu tiên và thứ hai (1"a") phải giống nhau. Nếu ai đó biết cách hợp nhất như thế trong trường hợp sử dụng Slick, hãy cho tôi biết.

Hoặc nói chung, cách hợp nhất các bộ dữ liệu với danh sách bên trong bằng các yếu tố giống nhau.

(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

Bạn mong đợi kết quả gì nếu bạn có trường hợp với (1, "a", "m") và (2, "a", "l") tuple? – 4lex1v

+0

@ 0__ cảm ơn bạn đã sửa đổi cú pháp tiếng Anh của tôi. – Outsider

Trả lời

8

Làm thế nào về:

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

Cảm ơn @ gzm0 !! đó là những gì tôi muốn chính xác. – Outsider

1

Bạn có thể thử 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) 

Cập nhật

Nếu danh sách đầu vào không được sắp xếp:

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

Điều này sẽ chỉ hoạt động là tất cả các bộ dữ liệu được sắp xếp như ví dụ trên. Nếu bốn bộ dữ liệu được sắp xếp theo cách khác nhau, thì giải pháp này sẽ không khớp với – Jatin

+0

Dữ liệu đến từ một cơ sở dữ liệu, do đó nó phải được sắp xếp theo cơ sở dữ liệu. Dù sao, chỉ trong trường hợp, tôi đã thêm một bản cập nhật. – Beryllium

+0

Tôi đã học được từ mã của bạn. nhưng câu trả lời của gzm0 nói chung là tôi nghĩ. btw cảm ơn bạn @Beryllium. – Outsider

Các vấn đề liên quan