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

Scala中统计嵌套列表内元素所在的子列表数量

嘿,这个需求我熟,给你分享几个Scala里的实现方法,都能精准达到你想要的统计效果:

方法一:flatMap + groupBy + mapValues(简洁常用写法)

核心思路是先处理每个子列表去重(避免同一个子列表里的重复元素干扰统计),再摊平分组,最后统计每组的数量:

val input = List(List("A", "A"), List("A", "B"), List("B", "C"), List("B", "C"))
val result = input
  .map(_.distinct) // 给每个子列表去重,确保同一个子列表里的元素只算一次
  .flatMap(identity) // 把嵌套列表摊平成一维列表
  .groupBy(identity) // 按元素值分组
  .mapValues(_.size) // 统计每组的元素个数,也就是该元素所在的子列表数量

println(result) // 输出: Map(A -> 2, B -> 3, C -> 2)
方法二:foldLeft手动累加(底层逻辑清晰)

如果想更清楚地看到计数的累加过程,可以用foldLeft一步步更新统计Map:

val input = List(List("A", "A"), List("A", "B"), List("B", "C"), List("B", "C"))
val result = input.foldLeft(Map.empty[String, Int]) { (acc, subList) =>
  // 先处理子列表去重,再逐个元素更新计数
  subList.distinct.foldLeft(acc) { (currentMap, elem) =>
    currentMap + (elem -> currentMap.getOrElse(elem, 0) + 1)
  }
}

println(result) // 同样得到目标结果: Map(A -> 2, B -> 3, C -> 2)
方法三:count函数直接统计(逻辑最直观)

还有一种更直白的写法:先拿到所有唯一元素,然后对每个元素统计包含它的子列表数量:

val input = List(List("A", "A"), List("A", "B"), List("B", "C"), List("B", "C"))
// 先提取所有不重复的元素
val uniqueElements = input.flatten.distinct
// 对每个元素统计有多少子列表包含它,再转成Map
val result = uniqueElements.map(elem => elem -> input.count(subList => subList.contains(elem))).toMap

println(result) // 输出一致

不过要注意,这种方法在数据量很大时效率会稍低,因为每个元素都要遍历所有子列表,时间复杂度是O(n*m),前两种方法则是线性时间复杂度。

内容的提问来源于stack exchange,提问作者Pedro Gonçalves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:08:58