如何从SWIFT中的两个结构数组中删除公共项

w8biq8rn  于 2022-10-04  发布在  Swift
关注(0)|答案(3)|浏览(168)

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

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

我的阵列:

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

我想从People数组中删除项,如果它们存在(按id比较)在selectedPeople数组上。

我尝试了几次数组过滤和转换为set,但都不起作用。我能在这里做些什么?

谢谢!

46qrfjad

46qrfjad1#

  • 获取seltedPeople中所有e1d0d1的数组
let selectedPeopleIDs = selectedPeople.map(.id)
  • 过滤id不在数组中的项
let filteredPeople = people.filter { !selectedPeopleIDs.contains(B1a1a1b.id) }
11dmarpk

11dmarpk2#

如果您知道如果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(B1a0a1b)}

    //swift older versions:
    people = people.filter{!contains(selectedPeople, B1a0a1b)}
}
w46czmvw

w46czmvw3#

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

如果Id对于people是唯一的,那么我会将它们存储在如下的词典中:

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

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

people.foreach {peopleDict[B1a1a1b.id] = B1a1a1b}

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

selectedPeople.foreach {peopleDict.remove(B1a2a1b.id)}

或者,要切换回people的阵列,只需说:

let filteredPeople = peopleDict.values as [PeopleSelectItem]

备注

1.我假设,selectedPeople比所有people的底数都小。如果不是这样,你应该在字典里填selectedPeople
1.我有没有说过我喜欢这个Spark喜欢API?我想我是这样做的。
1.我只是从我的脑海中写出了那段代码。如果它在语法上不完全正确,请让我知道,我会改正它。

相关问题