如何在Swift中使用reduce方法统计匹配数字的数量
使用Reduce统计数组中指定数字的匹配数量
嘿,这个问题问得好!reduce 确实是个非常灵活的工具,用来完成这种计数任务完全不在话下。我来一步步给你拆解怎么用它实现需求。
首先,先回顾下 reduce 的基本逻辑:它会从一个初始值开始,遍历数组的每一个元素,通过闭包里的规则不断更新这个初始值,最后返回最终的累加结果。
先从单个数字的统计开始
你之前用 filter 统计7的数量,用 reduce 可以这么写:
let items = [1, 2, 7, 5, 7, 8, 5, 5, 1, 7] let countOf7 = items.reduce(0) { result, item in // 如果当前元素是7,就给累加器加1,否则加0 return result + (item == 7 ? 1 : 0) } print(countOf7) // 输出:3
这里初始值是0(也就是计数的起点),每次遍历元素时,判断是不是7,是就给累加器result加1,否则加0,最后得到总数。
扩展到统计7和5的总数
要同时统计两个数字,只需要修改判断条件,把“等于7”改成“等于7或者等于5”就行:
let countOf7And5 = items.reduce(0) { result, item in result + (item == 7 || item == 5 ? 1 : 0) } print(countOf7And5) // 输出:7(3个7 + 4个5)
还可以用Swift的简写语法让代码更紧凑:
let countOf7And5 = items.reduce(0) { $0 + ($1 == 7 || $1 == 5 ? 1 : 0) }
这里$0代表累加器的当前值,$1代表数组里的当前元素,是不是简洁很多?
更灵活的优化方案
如果以后你需要统计更多数字(比如还要加个3),每次修改判断条件会很麻烦,可以把目标数字放到一个集合里,用contains来判断:
let targetNumbers: Set = [5, 7] // 可以随时添加更多数字 let totalCount = items.reduce(0) { $0 + (targetNumbers.contains($1) ? 1 : 0) }
这样不管要统计多少个数字,只要修改targetNumbers集合就行,代码复用性更高。
对比你之前用的filter+count,reduce的优势在于只需要遍历一次数组就能完成统计,虽然对于小数组来说性能差异可以忽略,但如果是超大数组,这种单次遍历的方式会更高效哦。
内容的提问来源于stack exchange,提问作者Ashot Khachatryan
相关产品推荐
相关产品推荐

