在不使用set操作diff的情况下在一个站点中查找对象而不是另一个站点

时间:2016-06-02 17:30:22

标签: scala

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))

然而,第二行代码不起作用。

1 个答案:

答案 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)