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
相关产品推荐
相关产品推荐

