如何在Swift中查找给定二维数组各子数组首项的最小值
Swift 查找二维数组子数组首项最小值实现
- 实现思路很直接:遍历二维数组,挨个对比每个子数组的第一个元素大小,既可以只拿到最小值结果,也能同步定位到这个最小值来自哪个子数组。
只需要获取最小值数值的最简写法
用Swift自带的高阶函数就能几行写完,不需要手写循环:
var arr = [[100,155],[150,199],[180,220],[50,290],[400,590]] // 提取所有子数组的首项,过滤掉空数组的无效值,直接找最小值 let minFirstNum = arr.compactMap { $0.first }.min() print(minFirstNum ?? 0) // 输出50
为啥用
compactMap不用map?因为空的子数组调用first会返回可选空值,compactMap会自动把这类值过滤掉,不会出现嵌套可选值还要多一层解包的麻烦。
需要找到最小值对应的原始子数组
如果像示例需求那样,不光要知道最小值是50,还要定位到它来自[50,290]这个子数组,就不用多此一举生成中间的首项数组了,直接对比原数组的元素找就行:
if let matchSubArr = arr.min(by: { ($0.first ?? 0) < ($1.first ?? 0) }) { let minNum = matchSubArr.first ?? 0 print("首项最小值是\(minNum),对应子数组是\(matchSubArr)") // 实际输出:首项最小值是50,对应子数组是[50, 290] }
实际写代码要注意的边界问题
- 代码里的
?? 0是针对空数组的基础兜底,如果你的业务里遇到空子数组有特殊处理规则(比如跳过、直接报错),可以把这部分替换成对应逻辑 - 如果你的原始二维数组本身是空的,上面两个方法的返回值都会是nil,一定要做可选值判断,别直接强制解包,很容易运行时崩溃
内容的提问来源于stack exchange,提问作者konya
相关产品推荐
相关产品推荐

