【问题标题】:How to remove common items from two struct arrays in Swift如何从 Swift 中的两个结构数组中删除公共项
【发布时间】:2016-08-23 11:53:23
【问题描述】:

在我的应用程序中,我有两个结构数组,我想从其中一个中删除常用项。我的结构:

struct PeopleSelectItem {
    var name = ""
    var id = ""
    var added = false
}

我的数组:

var people : [PeopleSelectItem] = []
var selectedPeople : [PeopleSelectItem] = []

如果在 selectedPeople 数组中存在(按 id 比较),我想从 people 数组中删除项目。

我尝试了几种数组过滤并转换为 set,但都没有奏效。我可以在这里做什么?

谢谢!

【问题讨论】:

  • 类似于之前的 SO 问题:stackoverflow.com/questions/32439289/…
  • 您是否尝试在模型中创建一个运算符,例如 func ==(lhs: PeopleSelectItem, rhs: PeopleSelectItem) -> [PeopleSelectItem] { lhs.id == rhs.id //and filter array }

标签: ios swift


【解决方案1】:
  • 获取 selectedPeople 中所有 ids 的数组

    let selectedPeopleIDs = selectedPeople.map { $0.id }
    
  • 过滤id不在数组中的项目

    let filteredPeople = people.filter { !selectedPeopleIDs.contains($0.id) }
    

【讨论】:

    【解决方案2】:

    如果你知道如果 id 相同则人与人是平等的,那么你可以使你的结构符合Equatable 协议,你可以使用数组过滤方法。

    struct PeopleSelectItem : Equatable {
        var name = ""
        var id = ""
        var added = false
    }
    
    func ==(lhs: PeopleSelectItem, rhs: PeopleSelectItem) -> Bool {
        return lhs.id == rhs.id
    }
    
    func filterPeople() {
        //swift 2, 3:
        people = people.filter{!selectedPeople.contains($0)}
    
        //swift older versions:
        people = people.filter{!contains(selectedPeople, $0)}
    }
    

    【讨论】:

    • 不再使用过滤函数,而是创建一个返回过滤结果模型的新运算符是否明智?
    【解决方案3】:

    如果people 可能有大量条目,则应考虑性能。因此,您应该使用 Swifts 字典和相应的哈希搜索来查找项目,而不是使用 n^2 算法进行搜索。

    如果Idpeople 来说是唯一的,那么我会将它们存储在字典中,例如:

        var peopleDict: [String:PeopleSelectItem] = [:]()
    

    您可以轻松地将您拥有的数组转换为该字典:

        people.foreach {peopleDict[$0.id] = $0}
    

    有了这本词典,删除单个条目非常容易:

        selectedPeople.foreach {peopleDict.remove($0.id)}
    

    可以选择切换回people 的数组,您只需说:

        let filteredPeople = peopleDict.values as [PeopleSelectItem]
    

    备注

    1. 我假设selectedPeople 小于所有people 的基数。如果不是这种情况,您应该在字典中输入selectedPeople
    2. 我说过我喜欢这个 Spark like api 吗?我想我这样做。
    3. 我只是在脑海中写下了这段代码。如果它在语法上不完全正确,请告诉我,我会更正它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多