Swift 3 - 两个字典数组之间的差异

nou*_*ouf 5 arrays comparison dictionary swift

我有两个字典数组:

let arrayA = [["name1": "email1"], ["name2": "email2"]]
let arrayB = [["name1": "email1"], ["name3": "email3"]]
Run Code Online (Sandbox Code Playgroud)

我想比较它们并得到另外两个数组:arrayC应该有arrayA中的元素而不是arrayB中的元素,而arrayD应该有arrayB中的元素而不是arrayA中的元素:

let arrayC = [["name2": "email2"]]
let arrayD = [["name3": "email3"]]
Run Code Online (Sandbox Code Playgroud)

如何考虑大型阵列呢?

dil*_*ver 12

干得好

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 }
}
Run Code Online (Sandbox Code Playgroud)


pbo*_*dsk 6

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

集可以给你的操作中找到的元素setA,但不是在setB或元素setAsetB开箱即用。

尽管有一些关于布景的警告。如《The Swift Programming Guide》中所述

集合在集合中存储相同类型的不同值,没有定义的顺序。当项目的顺序不重要时,或者需要确保某个项目仅出现一次时,可以使用集合而不是数组。

从上面的通知:

  • 不同:表示无重复
  • 没有明确的排序:意味着您不能期望您的集合是有序的

另外,请注意这一点(也来自The Swift Programming Guide):

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

如果您可以忍受……那我认为是一个很好的解决方案。

这是一个示例...我创建了一个简单的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
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以这样使用:

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"
Run Code Online (Sandbox Code Playgroud)

所以...我不知道这是否会使您感到困惑或使事情变得更难甚至可能(如果您的数据可以包含多个具有相同名称和电子邮件的元素),但是...我只是想你应该考虑套:)

希望对您有帮助。