如何从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] 

备注

  1. 我认为,那个selectedPeople比所有人的基础小一些。 如果不是这样的话,你应该selectedPeople一个字典中的人。
  2. 我说我喜欢这个Spark像api吗? 我想我是这样做的。
  3. 我从头脑里写了那个代码。 如果不是完全的句法正确,让我知道,我纠正它。