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

Swift 3中对比不等长数组并补占位符生成匹配数组

Swift 3实现以指定数组为基准生成匹配/占位符数组

嘿,这问题我帮你搞定!根据你的需求,我们需要以arr1为基准,逐个检查元素是否存在于arr2中(不管数组是否有序),存在就保留原元素,不存在就用"No match"占位。下面是具体的实现思路和代码:

核心思路

因为两个数组可能无序,所以不能按索引对比,得判断元素是否存在于arr2中。为了提升查找效率,我们可以先把arr2转换成Set——Set的元素查找时间复杂度是O(1),比直接用数组的contains()(O(n))高效得多,尤其是当数组元素较多时。

基础实现代码

let arr1 = [1, 2, 3, 4, 5]
let arr2 = [2, 3, 4]

// 将arr2转为Set,优化查找性能
let arr2Elements = Set(arr2)

// 遍历arr1,生成目标数组arr3
let arr3: [Any] = arr1.map { element in
    arr2Elements.contains(element) ? element : "No match"
}

print(arr3) // 输出结果:["No match", 2, 3, 4, "No match"]

类型安全的进阶实现(推荐)

上面的代码用了[Any]类型,虽然能满足需求,但在Swift这种强类型语言里,我们可以用枚举来让类型更安全,避免后续可能的类型转换问题:

// 定义枚举来区分匹配和不匹配的情况
enum MatchResult<T> {
    case matched(T)
    case noMatch
}

let arr1 = [1, 2, 3, 4, 5]
let arr2 = [2, 3, 4]
let arr2Elements = Set(arr2)

// 先生成类型安全的结果数组
let resultArray: [MatchResult<Int>] = arr1.map {
    arr2Elements.contains($0) ? .matched($0) : .noMatch
}

// 如果需要转换成题目要求的[Any]格式,再做一次转换
let arr3: [Any] = resultArray.map { result in
    switch result {
    case .matched(let value):
        return value
    case .noMatch:
        return "No match"
    }
}

这种方式的好处是,后续处理arr3时,你可以通过枚举的case来明确区分两种情况,不用做繁琐的类型判断和转换。

边界情况处理

  • 如果arr1是空数组,arr3也会是空数组;
  • 如果arr2是空数组,arr3的所有元素都会是"No match";
  • 如果arr1中有重复元素,只要该元素存在于arr2中,就会保留原元素(比如arr1=[2,2,3], arr2=[2],arr3会是[2,2,"No match"])。

内容的提问来源于stack exchange,提问作者Kanav Batra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:39:05