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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:01:23