我有两个以下的集合:
case class Foo(id: String)
case class Bar(id: String, fooId: String)
我想拉链它们,获得一对配对,但Foo.id == Bar.fooId
。基本上加入外键谓词。
答案 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}}实际需要查找具有重复项的密钥,您只会得到异常。)