2016-01-29 30 views
1

我有scala中的對象包含id的兩個集合。我想通過id將它們壓縮在一起。因此,在這樣的例子:斯卡拉郵編與排序集合的編號

case class A(id: Long) 
case class B(id: Long) 

val col1 = A(1) :: A(2) :: A(5) :: Nil 
val col2 = B(2) :: B(2) :: B(5) :: Nil 

我希望爲結果:

List(
    (A(1), List()), 
    (A(2), List(B(2), B(2)), 
    (A(5), List(B(5)) 
    ) 

如何做到這一點最簡單的方式? 如果我知道col1和col2已經按id排序,它會以某種方式幫助嗎?

回答

2

我想不出一個好辦法做到這一點,而沒有中間變量,但對這樣的事情怎麼樣:

val map = col2.groupBy(_.id).withDefault(_ => List.empty) 
col1.map { a => a -> map(a.id) } 

對於3元素數組也沒關係,但請注意,從對方的回答的主要區別是,這是線性時間。

2

一種方法是map第一收集和map內做第二個是filter,並建立一個元組:

scala> col1.map { c1 => 
    |  (c1, col2.filter(_.id == c1.id)) 
    | } 
res0: List[(A, List[B])] = List((A(1),List()), (A(2),List(B(2), B(2))), (A(5),List(B(5))))