我有一个对象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)
答案 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)