基于谓词(Scala)压缩两个集合

时间:2016-02-02 00:48:53

标签: scala

我有两个以下的集合:

case class Foo(id: String)
case class Bar(id: String, fooId: String)

我想拉链它们,获得一对配对,但Foo.id == Bar.fooId。基本上加入外键谓词。

1 个答案:

答案 0 :(得分:1)

如果每个Bar都有一个关联的Foo,并且每个foos.sortBy(_.id) zip bars.sortBy(_.fooId) 都有相同的编号且ID都不同,那么您不必考虑O(n log n)运行时,可以

(Foo, Bar)

获取Foo对的集合。

否则,只需创建从ID到val foomap = foos.map(x => x.id -> x).toMap bars.map(y => foomap(y.fooId) -> y) 的映射(假设它们具有唯一ID)并查找它。 E.g。

groupBy

如果您可能有多个ID或诸如此类的东西,并且需要进行一些错误处理,请考虑使用val foomap = foos.groupBy(_.id).mapValues{ case vs if vs.length == 1 => vs.head case _ => throw new Exception("Duplicate IDs") } 从ID创建映射,然后检查值的长度(如果您有一个值,则成功)如果没有适当的错误检查):

mapValues

(专业提示:bars是懒惰的,因此如果{{1}}实际需要查找具有重复项的密钥,您只会得到异常。)