如果对象中的某些字段相同,则对对象进行scala过滤器列表

时间:2019-05-15 15:37:39

标签: scala

我有一个对象PersonInfo的列表,如果PersonInfo对象中的某些字段与另一个PersonInfo对象相同,我会说这两个对象是重复的。 例如:

case class PersonInfo(
    firstName: Instant,
    lastName: Instant,
    ssn: String,
    email: String
)

如果两个PersonInfo对象具有相同的“ ssn”,则它们是重复记录。 我的列表如下:

val list = List(pi1, pi2, pi3)
pi1 is: PersonInfo("foo", "foo", "123-456-789", "foo@f.com")
pi2 is: PersonInfo("bar", "bar", "456-123-789", "bar@b.com")
pi3 is: PersonInfo("gee", "gee", "123-456-789", "gee@g.org)

由于pi1和pi3是重复的,我如何过滤列表以仅返回pi1和pi3的列表:

list.filter(f => pi1.ssn == pi3.ssn) => ???

我希望它返回List(pi1,pi2)

2 个答案:

答案 0 :(得分:3)

将它们分组,仅保留重复项,并以List的形式返回。

list.groupBy(_.ssn).values.filter(_.length > 1).flatten.toList

答案 1 :(得分:1)

我会使用groupBy + flatMap

val pi1 = PersonInfo("foo", "foo", "123-456-789", "foo@f.com")
val pi2 = PersonInfo("bar", "bar", "456-123-789", "bar@b.com")
val pi3 = PersonInfo("gee", "gee", "123-456-789", "gee@g.org")

val list = List(pi1, pi2, pi3)

val onlyDuplicates = list
    .groupBy(_.ssn)
    .flatMap{
      case (_, v) if v.length > 1 => v //take only elements that have 1+ occurence
      case _ => Nil
    }

println(onlyDuplicates) // List(pi1, pi3)