首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Seq[B]中减去Seq[A]

从Seq[B]中减去Seq[A]
EN

Stack Overflow用户
提问于 2019-05-22 22:40:17
回答 3查看 868关注 0票数 1

我有两个类AB。它们都有相同的属性:id和许多其他不同的属性。

如何通过匹配Seq[A]Seq[B]中减去id

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-22 23:26:32

另一个可行的解决方案:

代码语言:javascript
复制
val seqSub = seqB.filterNot(x => seqA.exists(_.id == x.id))
票数 3
EN

Stack Overflow用户

发布于 2019-05-22 22:55:59

只要两个类的id字段具有相同的类型,这就应该起作用。

代码语言:javascript
复制
val as: Seq[A] = ???
val bs: Seq[B] = ???

val asSet = as.iterator.map(a => a.id).toSet
val substracted: Seq[B] = bs.filterNot(b => asSet(b.id))
票数 4
EN

Stack Overflow用户

发布于 2021-03-17 05:39:09

找不到与我定义的减法匹配的答案,其中重复的元素没有被过滤,(例如Seq(1,2,2)减去Seq(2) = Seq(1,2),Det0的定义给出了Seq(1),所以在这里发布它。

代码语言:javascript
复制
    trait IntId {
      def id: Int
    }
    
    case class A(id: Int) extends IntId
    
    case class B(id: Int) extends IntId
    
    val seqB = Seq(B(1),B(4),B(7),B(7),B(7))
    
    val seqA = Seq(A(7))

    // BSubtractA =  Seq(B(1),B(4),B(7),B(7)), only remove one instance of id 7
    val BSubtractA = seqA.foldLeft(seqB){
      case (seqBAccumulated, a) =>
        val indexOfA = seqBAccumulated.map(_.id).indexOf(a.id)
        if(indexOfA >= 0) {
          seqBAccumulated.take(indexOfA) ++ seqBAccumulated.drop(indexOfA + 1)
        }
        else {
          seqBAccumulated
        }
    }

是的,这个解决方案也有缺点。例如,如果seqA大于seqB,那么它就会遇到空指针(+我没有将它重构为def)。此外,性能还可以提高,以减少对输入的迭代次数,然而,这满足了我的用例。

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

https://stackoverflow.com/questions/56259377

复制
相关文章

相似问题

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