Scala 如何根据CaseObj的属性使列表[CaseObj]与众不同?

Scala 如何根据CaseObj的属性使列表[CaseObj]与众不同?,scala,compare,equals,case-class,Scala,Compare,Equals,Case Class,通常我会调用distinct on 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 myObj

通常我会调用distinct on 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)
两个问题:

  • 如何计算受影响的对象数?根据
    s2
    的内容复制
  • 如何根据
    s2
    使列表清晰?当代码< S2==S2时,我会考虑两个实例对象是相同的。我是否需要将case类转换为普通类并重写equals?我需要一个自己的比较器吗?或者我可以使用一些Scala API方法来归档它吗
  • 如何计算受影响的对象数?基于 s2的内容

    如果要计算每个重复组中的对象数(如果只想知道要删除的对象数,请从大小中减去1):

    如何根据s2区分列表


    这是一个稍微安全的方法,
    
    myList.groupBy(0.s2).values.flatMap(0.headOption).toList
    

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

    这是两个问题,应该这样分开#1我不清楚#2是问题1的重复:如何查看s2中有多少MyObject对象具有相同的内容,而不管s1或s3中的内容是什么。我只关心这里的s2。问题2的意思是:我只想用s2保留一个MyObject。我不管是哪一个。根据案例类属性s2,结果列表应该是不同的。因此,上面的myList在转换后只有2个条目。
    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)
    
    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))