Foo对象的两个集合s1和s2,其中
case class Foo(id: Long, attri01: String) {
override def hashCode: Int = {
val prime = 41
prime * attri01.hashCode
}
override def equals(o: Any): Boolean = o match {
case Foo(_, attri01) => attri01 == this.attri01
case => false
}
}
equals和hashCode方法是数据比较的覆盖。
现在,我需要找出s1中的所有对象,但不能找到s2中的所有对象。我不能用
s1.diff(s2)
由于equals / hashCode方法覆盖。它可能会使用过滤器
s1.filter(_.id ...)
或创建一个地图,其中ID字段为其键,其对象为第一组的值,并删除第二组中的任何条目。
以Scala方式解决此问题的好方法是什么?
更新
我在考虑以下内容:
val set2IDs = s2.map(a => a.id)
val result = s1.map(Foo(id, _) => !set2IDs.contains(id))
然而,第二行代码不起作用。
答案 0 :(得分:1)
case class FooWrapper(id:Long)(val foo:Foo)
def wrap(foo:Foo) = new FooWrapper(foo.id)(foo)
val result = s1.map(wrap).diff(s2.map(wrap)).map(_.foo)