如何优雅地找出两个结构体数组属性匹配项并移除匹配元素?
优雅实现结构体数组按属性匹配移除元素
要高效完成这个需求,核心思路是先把待匹配的属性提取成集合(Set),利用集合O(1)的查找效率,再结合filter方法过滤数组,完全不需要嵌套for循环:
- 第一步:提取arr2中所有
name值存入Set,集合的查找性能远优于数组 - 第二步:用
filter过滤arr1,保留那些name不在上述集合中的元素
具体代码实现如下:
struct Example { var name: String } var arr1 = [Example(name: "Sam"), Example(name: "Ash"), Example(name: "Mike")] var arr2 = [Example(name: "David"), Example(name: "Sam"), Example(name: "Leonard")] // 提取arr2的name集合 let excludedNames = Set(arr2.map { $0.name }) // 过滤arr1,移除匹配name的元素 arr1 = arr1.filter { !excludedNames.contains($0.name) } // 输出结果:[Example(name: "Ash"), Example(name: "Mike")] print(arr1)
这种方式的优势:
- 时间复杂度从嵌套循环的O(n*m)降到O(n+m),性能更优
- 代码简洁易读,完全符合Swift的函数式编程风格
- 不需要手动写for循环处理元素,避免冗余代码
如果需要处理更复杂的属性匹配,也可以基于这个思路扩展,比如匹配多个属性时,把属性组合成元组存入Set即可。
内容的提问来源于stack exchange,提问作者Lionel Yu
相关产品推荐
相关产品推荐

