Scala中如何按指定字段对List集合去重获取不重复数据集
Scala按公司名称字段去重实现
首先修正原示例代码的语法问题(原代码存在类名大小写不一致、List初始化语法错误的问题,无法直接运行),基础定义如下:
// 若需完全保留原代码的小写类名,将CompanyDetails替换为companydetails即可 case class CompanyDetails(id: Int, name: String, overview: Int) val listOfData: List[CompanyDetails] = List( CompanyDetails(1,"google",95), CompanyDetails(2,"Accenture",78), CompanyDetails(3,"google",90), CompanyDetails(4,"facebook",78), CompanyDetails(5,"City", 89) )
方案1:使用内置distinctBy(推荐,Scala 2.13及以上版本支持)
Scala 2.13版本为集合新增了distinctBy方法,可以直接指定去重依据的字段,默认保留每个字段值第一次出现的元素,完全匹配需求的去重规则(保留首次出现的同名公司,丢弃后续重复项):
val result: List[CompanyDetails] = listOfData.distinctBy(_.name)
运行后输出结果和期望完全一致:
List( CompanyDetails(1,google,95), CompanyDetails(2,Accenture,78), CompanyDetails(4,facebook,78), CompanyDetails(5,City,89) )
方案2:兼容低版本Scala的手动实现
如果使用的Scala版本低于2.13,没有内置distinctBy方法,可以通过foldLeft遍历集合,维护一个已出现过的公司名集合,手动实现相同的去重逻辑:
val result: List[CompanyDetails] = listOfData .foldLeft( (Set[String](), List[CompanyDetails]()) ) { case ((existNames, acc), curr) => if (existNames.contains(curr.name)) (existNames, acc) else (existNames + curr.name, acc :+ curr) }._2
注:该实现逻辑和内置distinctBy完全一致,都是保留每个公司名第一次出现的条目,不会取后续重复的同名条目。
内容的提问来源于stack exchange,提问作者Priyakshee Mahanta
相关产品推荐
相关产品推荐

