我有两个字典数组:
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"
所以...我不知道这是为您感到困惑还是使事情变得更难或不可能(如果您的数据可以包含一个以上具有相同名称和电子邮件的元素(,但是...我只是以为您应该考虑设置:(
希望对您有帮助。