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
}
}
4条答案
按热度按时间ktecyv1j1#
只要这两个类的id字段具有相同的类型,这就应该起作用。
t2a7ltrp2#
另一个可行的解决方案:
c8ib6hqw3#
找不到符合我的subtract定义的答案,其中重复的元素不会被过滤,(例如Seq(1,2,2)subtract Seq(2)= Seq(1,2),det0的定义给出了Seq(1),因此将其发布在此处。
是的,这个解决方案有缺点。例如,如果
seqA
大于seqB
,那么它就会遇到空指针(+我还没有将其重构为def)。此外,性能可以通过减少对输入的迭代次数来提高,但是,这满足了我的用例。x0fgdtte4#
会干净得多-