swift 3 - 从另一个数组中存在的数组中删除对象

Posted

技术标签:

【中文标题】swift 3 - 从另一个数组中存在的数组中删除对象【英文标题】:swift 3 - remove objects from array that exist in another array 【发布时间】:2016-12-09 22:55:48 【问题描述】:

我有一个里面有联系人对象的数组。

然后我有另一个用户数组。

class Contact: NSObject 

    var name: String?
    var phoneNumber: String?
    var phoneNumberFormatted: String?

    init(name: String, phoneNumber: String?, phoneNumberFormatted: String) 
        self.name = name
        self.phoneNumber = phoneNumber
        self.phoneNumberFormatted = phoneNumberFormatted
    



 class User: NSObject 

        var name: String?
    

如果我的 [User] 中有一个名称匹配的用户,我如何从 [Contact] 中删除联系人对象?

我知道如何通过循环来做到这一点,但最有效的方法是什么?

【问题讨论】:

我将 phoneNumber 对象名称更改为 Contact。感谢您的帮助@AlexanderMomchliov @Walker 有什么理由让它成为 NSObject 吗?否则你不应该。此外,如果字段是必需的,您应该使用 let,使其非可选并为属性添加必需的初始化程序 如果你不打算让你的类 NSCoding 兼容,你不需要继承 NSObject 你在用 Swift 编码,不需要子类 NSObject 除非你有特定的原因(表现得像 NSObject) 如果你需要一个实例,你可以看看这个答案***.com/a/37983027/2303865 【参考方案1】:

对非平凡数组大小执行此操作的最佳(计算效率最高)方法是从需要重复搜索的数组中预先计算一个集合,并过滤其他数组,仅在未在其中找到元素时才保留元素集合。

这利用了SetO(1) 查找性能。算法整体为O(userPhoneNumbers.count + contacts.count)

let userPhoneNumbers = Set(users.lazy.map $0.phoneNumber )
let filteredContacts = self.contacts.filter !userPhoneNumbers.contains($0.phoneNumber) 

【讨论】:

Alex,我正在尝试按两个数组中的对象都具有的属性进行过滤。答案对我来说不是很清楚。脑洞扩大一点?谢谢大佬 你熟悉map/reduce/filter吗?

以上是关于swift 3 - 从另一个数组中存在的数组中删除对象的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 从一个数组中删除另一个数组中不存在的对象并保持顺序

在 SpriteKit/Swift 中从数组中删除元素

从另一个数组列表中删除一个数组列表元素的最佳方法

使用此特定代码从另一个数组中删除一个数组[重复]

根据复选框检查从另一个数组中删除数组

Ios Swift:删除图像数组中的重复项