Swift 3-两个字典阵列之间的差异



我有两个字典数组:

let arrayA = [["name1": "email1"], ["name2": "email2"]]
let arrayB = [["name1": "email1"], ["name3": "email3"]]

我想比较它们并获得另外两个数组:arrayc应该在arraya中具有元素,但在arrayb中不应具有元素,并且arrayd应在arrayb中具有元素,但在arraya中不应具有:

中的元素。
let arrayC = [["name2": "email2"]]
let arrayD = [["name3": "email3"]]

我该如何考虑大型阵列?

在这里您去

let arrayA = [["name1": "email1"], ["name2": "email2"]]
let arrayB = [["name1": "email1"], ["name3": "email3"]]
let arrayC = arrayA.filter{
    let dict = $0
    return !arrayB.contains{ dict == $0 }
}
let arrayD = arrayB.filter{
    let dict = $0
    return !arrayA.contains{ dict == $0 }
}

我知道这个答案可能使事情复杂化,并且可以使用过滤器,但是...您是否考虑过使用Sets而不是Arrays

设置可以为您提供操作,以在setA中找到元素,但在setB中不能或setA中的元素和setB中的元素。

虽然有一些有关集合的警告。正如它在Swift编程指南中所说的那样

一个集合在没有定义的排序的集合中存储同一类型的不同值。当项目的顺序不重要时,或者需要确保仅出现一次。

时,您可以使用集合而不是数组。

从上面注意:

  • 独特:意思是没有重复的
  • 没有贴皮的订购:意味着您不能期望自己的设置是顺序的

另外,请注意此(也来自Swift编程指南(:

必须使用一种类型才能存储在集合中,也就是说,该类型必须提供一种计算自身的哈希值的方法。

如果您能与之相处...然后,我认为集合是一个很好的解决方案。

这是一个例子...我创建了一个简单的Email结构,并使该结构实现了Hashable

struct Email {
    let name: String
    let email: String
}
extension Email: Hashable {
    var hashValue: Int {
        return "(name)(email)".hashValue
    }
    static func ==(lhs: Email, rhs: Email) -> Bool {
         return lhs.name == rhs.name && lhs.email == rhs.email
    }
}

然后可以像这样使用:

let arrayA = [Email(name: "name1", email: "email1"), Email(name: "name2", email: "email2")]
let arrayB = [Email(name: "name1", email: "email1"), Email(name: "name3", email: "email3")]
let setA = Set(arrayA)
let setB = Set(arrayB)
let inBothAAndB = setA.intersection(setB) //gives me an Email with "name1", "email1"
let inAButNotB = setA.subtracting(setB) //gives me an Email with "name2", "email2"
let inBButNotA = setB.subtracting(setA) //gives me an Email with "name3", "email3"

所以...我不知道这是为您感到困惑还是使事情变得更难或不可能(如果您的数据可以包含一个以上具有相同名称和电子邮件的元素(,但是...我只是以为您应该考虑设置:(

希望对您有帮助。

最新更新