【问题标题】:swift 3 - remove objects from array that exist in another arrayswift 3 - 从另一个数组中存在的数组中删除对象
【发布时间】: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)
  • 如果你需要一个实例,你可以看看这个答案stackoverflow.com/a/37983027/2303865

标签: arrays swift3


【解决方案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吗?
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
相关资源
最近更新 更多