Scala问题:如何用map、reduce、filter统计两列表对应位置差异元素数量
解决方法:用map、reduce计算列表对应位置的差异数量
没问题,咱们一步步来实现这个需求,完全用你指定的map、reduce(也可以结合filter)就能搞定。
核心思路拆解
要计算两个列表对应位置的不同元素数量,我们需要完成三个关键步骤:
- 配对对应位置元素:把两个列表中同一位置的元素组合成元组,这样才能逐个对比。
- 标记差异元素:对每一对元素,判断是否不同,用
1标记差异、0标记相同。 - 累加差异数量:把所有标记值加起来,得到总的差异数。
具体实现代码
方法一:map + reduce(推荐,安全稳定)
先通过zip把两个列表配对,再用map标记差异,最后用reduce求和:
var l1 = List(1,0,0) var l2 = List(0,0,1) val diffCount = l1.zip(l2) .map { case (a, b) => if (a != b) 1 else 0 } // 标记差异,得到List(1,0,1) .reduce(_ + _) // 累加求和,结果为2 println(diffCount) // 输出2
这里的zip是列表的基础操作,用来生成对应位置的元组列表(比如List((1,0), (0,0), (0,1))),核心逻辑完全依赖map和reduce,符合你的要求。
方法二:filter + reduce
如果你更倾向用filter,可以先过滤出所有元素不等的元组,再用reduce计数:
val diffCount = l1.zip(l2) .filter { case (a, b) => a != b } // 过滤出差异元组,得到List((1,0), (0,1)) .reduce((acc, _) => acc + 1) // 计数,结果为2
⚠️ 注意:如果两个列表完全相同,过滤后的列表为空,reduce会抛出异常。所以这种方法适合能确定存在至少一个差异的场景,或者你可以额外处理空列表的情况。
不使用zip的替代方案(严格依赖map)
如果要求完全不能用zip,我们可以手动生成索引,用map来配对元素:
val diffCount = (0 until l1.length) .map(i => (l1(i), l2(i))) // 手动配对对应位置元素 .map { case (a, b) => if (a != b) 1 else 0 } .reduce(_ + _)
这个方式和第一种逻辑一致,只是用索引遍历代替了zip。
验证结果
运行上面的代码,都会得到2,正好对应你例子中l1和l2的两处差异(第一个元素和第三个元素)。
内容的提问来源于stack exchange,提问作者QuestionAsker123
相关产品推荐
相关产品推荐

