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

Swift中如何按位置对二维数组元素求和得到一维数组

Swift 二维数组同位元素求和高性能实现

针对Int类型二维数组,按相同索引位置对所有子数组元素求和、最终返回一维结果数组的需求,以下是兼顾简洁性和性能的实现方案,同时支持不等长子数组场景,也提供等长场景的优化版本。

需求示例

输入二维数组:

let array: [[Int]] = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]

期望输出结果:

let result: [Int] = [11, 14, 11, 9]

适配不等长子数组的通用实现

该版本不需要提前对子数组做等长处理,相比常规实现去掉了循环内的分支判断,同时提前预分配结果数组内存避免动态扩容开销,执行效率更高,代码也更简洁:

func sumElementsInSubArrays(_ array: [[Int]]) -> [Int] {
    // 空数组直接返回
    guard let maxSubarrayLength = array.map(\.count).max() else {
        return []
    }
    // 一次性初始化全0结果数组,预分配足够空间
    var result = [Int](repeating: 0, count: maxSubarrayLength)
    
    for subarray in array {
        for (index, value) in subarray.enumerated() {
            result[index] += value
        }
    }
    return result
}

实现优势:

  • 预分配内存:提前计算最长子数组长度,避免数组反复扩容的性能损耗
  • 无分支循环:去掉了循环内判断索引是否超出结果数组长度的if/else分支,CPU分支预测效率更高,执行速度更快
  • 原生支持不等长子数组,不需要额外做补全处理

等长子数组场景的高性能优化版本

如果你已经提前将所有子数组处理为相同长度,可以使用绕过数组边界检查的unsafe版本,性能还能进一步提升,适合处理超大规模数组的场景:

func sumEqualLengthSubArrays(_ array: [[Int]]) -> [Int] {
    guard !array.isEmpty else { return [] }
    let elementCount = array[0].count
    var result = [Int](repeating: 0, count: elementCount)
    
    result.withUnsafeMutableBufferPointer { resultBuffer in
        for subarray in array {
            subarray.withUnsafeBufferPointer { subBuffer in
                for i in 0..<elementCount {
                    resultBuffer[i] += subBuffer[i]
                }
            }
        }
    }
    return result
}

注意:该实现默认所有子数组长度完全一致,若存在不等长情况会触发内存越界崩溃,仅在确认子数组等长时使用。


内容的提问来源于stack exchange,提问作者Joan Cardona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:36:15