scala -diff两个字段子集的两个案例类列表



给定两个案例类列表

case class Entity(field1: String, field2: String, field3: String)
val a: Seq[Entity] = ...
val b: Seq[Entity] = ...

如何基于field1和field2在a中不在b中的所有实体,忽略field3?

我考虑过覆盖案例类的equals((函数,也考虑了案例类((的整洁技巧(忽略的字段使用(方法,但是需要有多种组合的这些字段来进行不同的使用案例,例如使用field1 field2的diff,然后使用field 1 field 3,等等...

带有ints,而不是字符串,用于易于测试:

def similar (e: Entity, f: Entity) = { e.field1 == f.field1 && e.field2 == f.field2 }
scala> a
res60: Seq[Entity] = List(Entity(1,2,3), Entity(1,3,4), Entity(4,6,8), Entity(3,4,5))
scala> b
res61: Seq[Entity] = List(Entity(1,3,5), Entity(4,6,8), Entity(4,9,25))
scala> a.filter (aa => {! b.exists {bb => similar (aa, bb)} })
res62: Seq[Entity] = List(Entity(1,2,3), Entity(3,4,5))
  val bad = b.iterator.map { x => x.field1 -> x.field2 }.toSet
  val filtered = a.filterNot { x => bad(x.field1 -> x.field2) }

您可以使用!b.exists()的特定条件过滤a

case class Entity(field1: String, field2: String, field3: String)
val a = Seq(Entity("1", "p", "x"), Entity("2", "q", "y"), Entity("3", "r", "z"))
val b = Seq(Entity("1", "p", "x"), Entity("2", "q", "x"), Entity("3", "s", "z"))
a.filter( elA => 
  !b.exists(elB => elB.field1 == elA.field1 && elB.field2 == elA.field2)
)
// res1: Seq[Entity] = List(Entity(3,r,z))

创建一个仅对您要进行比较的字段感兴趣的实体映射类:

class EntityMap1_2( e: Entity ) {
  override def equals( o: Any ): Boolean = ???
  override def hashCode: Int = ???
}

它仅在字段1和2方面定义equalshashCode。然后,您可以填充相应的集合并找到差异。

与字段的其他组合类似。

最新更新