【问题标题】:How to make a List[CaseObj] distinct based on a property of CaseObj?如何根据 CaseObj 的属性使 List[CaseObj] 不同?
【发布时间】:2018-11-14 16:47:03
【问题描述】:

通常我在 List 上调用 distinct 来删除重复项或将其转换为 Set。现在我有一个List[MyObject]MyObject 是一个案例类,见下文:

case class MyObject(s1: String, s2:String, s3:String) 

假设我们有以下情况:

val myObj1 = MyObject("", "gmail,com", "some text")
val myObj2 = MyObject("", "gmail,com", "")
val myObj3 = MyObject("some text", "gmail.com", "")
val myObj4 = MyObject("some text", "gmail.com", "some text")
val myObj5 = MyObject("", "ymail.com", "")
val myObj6 = MyObject("", "ymail.com", "some text")

val myList = List(myObj1, myObj2, myObj3, myObj4, myObj5, myObj6)

两个问题:

  1. 如何计算受影响的对象数量?根据s2的内容重复?
  2. 如何根据s2 区分列表?当s2 == s2 时,我会认为两个案例对象相同。我是否需要将案例类转换为普通类并覆盖等于?我需要自己的 Comparator 还是可以使用一些 Scala API 方法来存档?

【问题讨论】:

  • 这是两个问题,应该这样拆分。 #1我不清楚。 #2 是 stackoverflow.com/questions/3912753/… 的副本
  • 问题1的意思是:无论s1或s3有什么,如何查看s2中有多少个MyObject对象有相同的内容。我只关心这里的s2。问题 2 的意思是:我只想用 s2 保留一个 MyObject。我不在乎哪一个。结果列表应根据案例类属性 s2 不同。因此,上面的 myList 在转换后只有 2 个条目。

标签: scala compare equals case-class


【解决方案1】:

如何计算受影响的对象数量?基于副本的 s2的内容?

如果您想计算每个重复组中有多少对象(如果您只想知道要删除多少对象,请从 size 中减去 1):

myList.groupBy(_.s2).map(x => (x._1, x._2.size))
res0: scala.collection.immutable.Map[String,Int] = Map(ymail.com -> 2, gmail.com -> 2, gmail,com -> 2)

如何根据 s2 使列表与众不同?

myList.groupBy(_.s2).map(_._2.head)
res1: scala.collection.immutable.Iterable[MyObject] = List(MyObject(,ymail.com,), MyObject(some text,gmail.com,), MyObject(,gmail,com,some text))

【讨论】:

    【解决方案2】:

    这里有一个稍微安全一点的方法, myList.groupBy(_.s2).values.flatMap(_.headOption).toList

    或者, scala.reflect.internal.util.Collections.distinctBy(myList)(_.s2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      相关资源
      最近更新 更多