首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >压缩稀疏序列

压缩稀疏序列
EN

Stack Overflow用户
提问于 2016-04-05 20:44:58
回答 1查看 80关注 0票数 1

我有两个对象序列,其中对象共享一个公共属性(让我们称之为id)。

代码语言:javascript
复制
case class ThingA(id: Int, someAttribute: String)
case class ThingB(id: Int, someOtherAttribute: Float)

我想加入“稀疏”列表,也就是说,每个ThingA.id都可能不匹配ThingB.id,反之亦然。in在每个列表中都是唯一的。

示例输入:

代码语言:javascript
复制
val thingAs = Seq(ThingA(0, "foo"), ThingA(1, "bar"))
val thingBs = Seq(ThingB(0, 1.0), ThingB(2, 0.3))

期望产出:

代码语言:javascript
复制
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))
)

我目前的尝试如下:

代码语言:javascript
复制
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

这很有效,但我希望有更好的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-05 21:43:58

一种方法是首先计算所有ids的联合,然后使用查找映射获取相应的ThingAThingB实例,就像@Dima建议的那样。

代码语言:javascript
复制
val lookupThingA = thingAs.map(x => x.id -> x).toMap
val lookupThingB = thingBs.map(x => x.id -> x).toMap

val zipped: Seq[(Option[ThingA], Option[ThingB])] =
    (lookupThingA.keySet | lookupThingB.keySet).map(i => (lookupThingA.get(i), lookupThingB.get(i))).toList

输出(请注意,您可以使用Set而不是Seq):

代码语言:javascript
复制
(Some(ThingA(1,bar)),None)
(Some(ThingA(0,foo)),Some(ThingB(0,1.0)))
(None,Some(ThingB(2,0.3)))

(我让它作为一个社区维基,如果有人想要改善这一点)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36436702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档