【发布时间】:2016-04-05 20:44:58
【问题描述】:
我有两个对象序列,其中对象共享一个公共属性(我们称之为 id)
case class ThingA(id: Int, someAttribute: String)
case class ThingB(id: Int, someOtherAttribute: Float)
我想加入“稀疏”列表,也就是说每个ThingA.id 可能不匹配ThingB.id,反之亦然。每个列表中的 id 都是唯一的。
示例输入:
val thingAs = Seq(ThingA(0, "foo"), ThingA(1, "bar"))
val thingBs = Seq(ThingB(0, 1.0), ThingB(2, 0.3))
期望的输出:
val zipped: Seq(Tuple[Option[ThingA], Option[ThingB]]) = Seq(
(Some(ThingA(0, "foo")), Some(ThingB(0, 1.0))), // Matching id = 0
(Some(ThingA(1, "bar")), None),
(None, Some(ThingB(2, 0.3))
)
我目前的尝试是这样的:
val zipped = (
thingAs.map(a => (Some(a), thingBs.find(b => b.id == a.id))) ++
thingBs.map(b => (thingAs.find(a => a.id == b.id), Some(b)))
).distinct
这行得通,但我希望有更好的方法。
【问题讨论】:
-
查看
.groupBy。按 id 分组一个 seq,然后map另一个加入。 -
@Dima,
.groupBy没有意义? " id 在每个列表中都是唯一的。" -
@ArchetypalPaul 重点是
Map中的查找是恒定时间 -
对,但是groupBy不需要把它变成Map。
标签: scala