Scala 如何根据CaseObj的属性使列表[CaseObj]与众不同?
通常我会调用distinct on List来删除重复项或将其转换为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
集。现在我有了一个列表[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))