我在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排序了它会不会有所帮助?
答案 0 :(得分: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))))
答案 1 :(得分:2)
在没有中间变量的情况下,我无法找到一个很好的方法,但是这样的事情怎么样:
val map = col2.groupBy(_.id).withDefault(_ => List.empty)
col1.map { a => a -> map(a.id) }
对于3元素阵列并不重要,但请注意,与其他答案的主要区别在于这是线性时间。