带有已分类集合的ID的Scala zip

时间:2016-01-29 11:25:25

标签: scala functional-programming

我在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 个答案:

答案 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元素阵列并不重要,但请注意,与其他答案的主要区别在于这是线性时间。