如何根据CaseObj的属性使List [CaseObj]不同?

时间:2016-08-11 15:16:51

标签: scala compare equals case-class

通常我会在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. 如何计算受影响的对象数量?根据{{​​1}}?
  2. 的内容重复
  3. 如何根据s2使列表与众不同?在s2时,我会考虑两个案例对象相同。我是否需要将case类转换为普通类并覆盖equals?我是否需要一个自己的比较器,或者我可以使用一些Scala API方法来存档它吗?

2 个答案:

答案 0 :(得分:6)

  

如何计算受影响的物体数量?基于的重复   s2的内容?

如果要计算每个重复组中有多少个对象(如果您只想知道要删除多少个对象,请从大小中减去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))

答案 1 :(得分:0)

这是一种较为安全的方法, myList.groupBy(_.s2).values.flatMap(_.headOption).toList

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