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
相关产品推荐
相关产品推荐

