从结构数组中删除结构数组Swift

时间:2016-07-10 15:21:04

标签: swift

我有一系列结构,如下所示:

struct minStruct {

var namn:String?
var imag:UIImage?
var rea:String?
var comp:String?

}

var structArr = [minStruct]()

如果我想从该数组中删除特定的结构,我可以这样做:

var oneStruct = minStruct(namn: "Name", imag: UIImage(named: "Image"), rea: "Something", comp: "Something")

if structArr.filter({$0.namn == oneStruct!.namn}).count > 0 {

structArr = structArr.filter({$0.namn != oneStruct!.namn})

}

但是,我想要做的是从structArr中删除一个结构数组。像这样:

structArr = [minStruct(namn: "Name", imag: UIImage(named: "Image"), rea: "Something", comp: "Something"), minStruct(namn: "secondName", imag: UIImage(named: "secondImage"), rea: "Something2", comp: "Something2"), minStruct(namn: "thirdName", imag: UIImage(named: "thirdImage"), rea: "Something3", comp: "Something3")]

var arrToDelete = [minStruct(namn: "Name", imag: UIImage(named: "Image"), rea: "Something", comp: "Something"), minStruct(namn: "secondName", imag: UIImage(named: "secondImage"), rea: "Something2", comp: "Something2")]

所以我想要做的是从arrStruct中删除arrToDelete中的所有项目。在此示例中,arrToDelete包含structArr包含的三个结构中的两个。我想删除这两个结构并保留arrToDelete不包含的结构。我希望我足够清楚!

2 个答案:

答案 0 :(得分:3)

可哈希

所以我们有结构。首先,让我们Hashable

struct Element: Hashable {
    var name: String?
    var image: UIImage?
    var rea: String?
    var comp: String?
    var hashValue: Int { return name?.hashValue ?? image?.hashValue ?? rea.hashValue ?? comp.hashValue ?? 0 }
}

func ==(left:Element, right:Element) -> Bool {
    return left.name == right.name && left.image == right.image && left.rea == right.rea && left.comp == right.comp
}

数据

接下来我们有这两个数组

let elms : [Element] = [
    Element(name:"a", image:nil, rea:nil, comp:nil),
    Element(name:"b", image:nil, rea:nil, comp:nil),
    Element(name:"c", image:nil, rea:nil, comp:nil)
]

let shouldBeRemoved: [Element] = [
    Element(name:"b", image:nil, rea:nil, comp:nil),
    Element(name:"c", image:nil, rea:nil, comp:nil)
]

解决方案#1

如果您关心原排序,您可以使用

let filtered = Array(Set(elms).subtract(shouldBeRemoved))

解决方案#2

如果您 DO 关心原始排序

let shouldBeRemovedSet = Set(shouldBeRemoved)
let filtered = elms.filter { !shouldBeRemovedSet.contains($0) }
  

为什么我不写这个?

let filtered = elms.filter { !shouldBeRemoved.contains($0) }
     

以上一行是正确的解决方案。无论如何调用contains   Array通常较慢(通常需要执行n / 2次检查)   而不是在Set上调用它(通常是一次检查)。

答案 1 :(得分:0)

由于某种原因,实际上不允许使用布尔逻辑对结构进行比较,因此甚至很难在结构数组中搜索项目或项目的索引。因此,例如,如果您想在结构数组中搜索特定的结构,然后将其删除:

首先,您需要转到结构文件并为其提供一个协议,该协议允许在boolean逻辑中使用该结构,所以...

struct Persons: Equatable {
      struct properties...
       struct init....
      }

然后,您可以使用诸如...的数组方法在数组中进行搜索。

firstIndex(of: theStructYourLookingFor)
lastIndex(of: _)

或任何其他与布尔相关的数组方法。

在Swift 4.0及更高版本中-2019年4月起可能是新的