Scala中如何对含ListBuffer成员的样例类按ListBuffer元素去重
Scala 样例类按 ListBuffer 字段去重方案
首先你给出的样例类存在两处需要补充的内容:缺少类名、ListBuffer 为泛型集合需要指定元素类型,修正后的示例如下:
import scala.collection.mutable.ListBuffer // 此处 DemoData 为自定义类名,ListBuffer[String] 可根据实际元素类型替换 case class DemoData(a: String, b: String, c: ListBuffer[String])
以下是两种常用的去重实现方式:
- **方式1:Scala 2.13+ 版本直接使用
distinctBy
Scala 2.13 及以上版本的集合内置distinctBy方法可直接指定去重维度,ListBuffer默认的equals方法会逐元素比对内容,直接按c字段去重即可:
val dataList: List[DemoData] = // 你的样例类实例列表 val deduplicatedList = dataList.distinctBy(_.c)
- 方式2:低版本 Scala 通用实现
可通过foldLeft结合Set记录已出现的ListBuffer元素实现去重:
import scala.collection.mutable.Set val deduplicatedList = dataList.foldLeft((List.empty[DemoData], Set.empty[ListBuffer[String]])) { case ((resultList, existedC), currentData) => if (existedC.contains(currentData.c)) { (resultList, existedC) } else { (currentData :: resultList, existedC += currentData.c) } }._1.reverse
说明:两种方案默认保留列表中第一个出现的实例,如需保留最后出现的实例,可先将列表反转后再执行去重逻辑。
内容的提问来源于stack exchange,提问作者Yogesh
相关产品推荐
相关产品推荐

