如何从Swift中的两个结构数组中删除共同的项目
在我的应用程序,我有两个结构数组,我想从其中之一删除公共项目。 我的结构:
struct PeopleSelectItem { var name = "" var id = "" var added = false }
我的数组:
var people : [PeopleSelectItem] = [] var selectedPeople : [PeopleSelectItem] = []
我想从人数组中删除项目,如果它们存在(比较ID)selectedPeople数组。
我尝试了几个数组过滤和转换设置,但没有一个工作。 我能在这里做什么?
谢谢!
-
在selectedPeople中获取所有
id
的数组let selectedPeopleIDs = selectedPeople.map { $0.id }
-
筛选其ID不在数组中的项目
let filteredPeople = people.filter { !selectedPeopleIDs.contains($0.id) }
如果你知道人们平等,如果id是相同的,那么你可以使你的结构符合Equatable
协议,你可以使用数组filter方法。
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)} }
如果people
可能有大量的条目,应考虑性能。 因此,不要使用n ^ 2algorithmsearch,而应该使用Swifts词典和相应的散列search来查找项目。
如果Id
对于people
是独一无二的,那么我会将它们存储在字典中,如:
var peopleDict: [String:PeopleSelectItem] = [:]()
你可以很容易地从数组中转换到这个字典:
people.foreach {peopleDict[$0.id] = $0}
有了这本词典,删除单个条目非常简单:
selectedPeople.foreach {peopleDict.remove($0.id)}
可以select切换回刚才说的people
的数组:
let filteredPeople = peopleDict.values as [PeopleSelectItem]
备注
- 我认为,那个
selectedPeople
比所有人的基础小一些。 如果不是这样的话,你应该selectedPeople
一个字典中的人。 - 我说我喜欢这个Spark像api吗? 我想我是这样做的。
- 我从头脑里写了那个代码。 如果不是完全的句法正确,让我知道,我纠正它。