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)
我知道这个答案可能会使事情复杂化,您可以使用过滤器,但是...您是否考虑过使用Sets而不是Arrays?
集可以给你的操作中找到的元素setA,但不是在setB或元素setA和setB开箱即用。
尽管有一些关于布景的警告。如《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)
所以...我不知道这是否会使您感到困惑或使事情变得更难甚至可能(如果您的数据可以包含多个具有相同名称和电子邮件的元素),但是...我只是想你应该考虑套:)
希望对您有帮助。