You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:09:15