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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:06:47