Swift数组修改需求:在负数前插入正值并统计插入元素数量
Swift数组处理:负数前插入对应正数并统计插入数量
先直接给出结论:
- .filter方法完全不适用:它仅用于筛选元素,只能保留或丢弃原数组元素,无法完成插入新元素的需求。
- .map方法本身无法实现:map是一对一的元素映射逻辑,而我们需要对负数做一对二的处理(插入对应正数+保留原负数),不过可以用
flatMap(函数式风格)替代,但统计插入数量需要额外步骤。 - for-in循环是最直观高效的选择:遍历过程中可同时完成数组构建和插入计数,逻辑清晰,便于调试和维护。
1. for-in循环实现(推荐)
一次遍历即可完成所有操作,无需额外计算插入数量:
var arrayInt: [Int] = [22, 16, -39, 1, -200] var resultArray: [Int] = [] var insertCount = 0 for num in arrayInt { if num < 0 { resultArray.append(-num) insertCount += 1 } resultArray.append(num) } print(resultArray) // 输出:[22, 16, 39, -39, 1, 200, -200] print("插入元素数量:\(insertCount)") // 输出:2
2. flatMap函数式实现
如果偏好函数式编程风格,可通过flatMap将每个元素转换为数组后展平,但插入数量需单独统计原数组的负数个数:
let arrayInt: [Int] = [22, 16, -39, 1, -200] let resultArray = arrayInt.flatMap { num -> [Int] in num < 0 ? [-num, num] : [num] } // 每个负数对应插入一个元素,直接统计原数组负数数量即可 let insertCount = arrayInt.filter { $0 < 0 }.count print(resultArray) // 输出:[22, 16, 39, -39, 1, 200, -200] print("插入元素数量:\(insertCount)") // 输出:2
为什么不用单纯的.map?
map要求每个输入元素对应唯一的输出元素,无法实现一个负数对应两个输出元素(正数+原负数)的逻辑,因此单纯的map无法满足需求。
内容的提问来源于stack exchange,提问作者dddr
相关产品推荐
相关产品推荐

