【问题标题】:scala filter list of object if some fields in the object are same如果对象中的某些字段相同,则对象的scala过滤器列表
【发布时间】:2019-05-17 01:23:23
【问题描述】:

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

【问题讨论】:

  • 您可能会在这里找到答案:stackoverflow.com/questions/3912753/…
  • 您可以在您的案例类上覆盖equals 方法并使用distinct
  • 我认为这部分问题only return list of (pi1 and pi3)expect it to return List(pi1, pi2)冲突

标签: scala


【解决方案1】:

将它们分组,只保留重复的,返回为List

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

【讨论】:

    【解决方案2】:

    我会使用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)
    

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 2016-01-21
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 2012-08-07
      相关资源
      最近更新 更多