Scala统计列表中长度≥2的指定元素连续分组数的实现方法
解决方法
你只需要在折叠分组时额外记录每个连续元素的出现长度,最终统计时过滤掉长度不足2的分组即可,具体实现如下:
实现逻辑
- 调整
foldLeft的累加器结构,同时存储连续元素的值和对应连续出现的长度 - 遍历序列时更新累加器:遇到和上一个相同的元素就累加长度,不同则新增分组记录
- 最终统计时仅保留长度≥2的分组,再统计目标元素的分组数量
代码实现
// 遍历序列生成带长度的连续分组,格式为 List[(元素值, 连续长度)] val consecutiveGroups = daysSequence.foldLeft(List[(Int, Int)]()) { (acc, current) => acc match { // 累加器为空,新增第一个分组 case Nil => List((current, 1)) // 当前元素和最后一个分组的元素相同,累加长度 case (lastVal, lastCnt) :: tail if lastVal == current => (lastVal, lastCnt + 1) :: tail // 当前元素和最后一个分组的元素不同,新增分组 case _ => (current, 1) :: acc } } // 统计长度≥2的1的分组数量 val count1Grp = consecutiveGroups.count { case (value, length) => value == 1 && length >= 2 } // 统计长度≥2的0的分组数量 val count0Grp = consecutiveGroups.count { case (value, length) => value == 0 && length >= 2 }
结果验证
第一个示例
输入序列的连续分组结果为:(-1, 16)、(1, 4)、(0, 1)、(-1, 9),过滤长度≥2的分组后,仅保留(-1, 16)、(1, 4),最终得到count1Grp=1、count0Grp=0,符合预期。
第二组示例
- 输入1的分组为
(0, 18)、(1, 2)、(0, 10),所有分组长度都≥2,结果为count1Grp=1、count0Grp=2 - 输入2的分组为
(-1, 9)、(1, 1)、(0, 6)、(-1, 1)、(0, 3)、(-1, 9),过滤后仅保留长度≥2的分组,结果为count1Grp=0、count0Grp=2
内容的提问来源于stack exchange,提问作者gjin
相关产品推荐
相关产品推荐

