gpt4 book ai didi

swift - 如何提取字典之间的差异?

转载 作者:搜寻专家 更新时间:2023-10-30 22:32:45 25 4
gpt4 key购买 nike

我可以像这样比较两个字典是否匹配:

func ==(lhs: [String: AnyObject], rhs: [String: AnyObject] ) -> Bool {
return NSDictionary(dictionary: lhs).isEqualToDictionary(rhs)
}

是否有一种简洁的方法来提取 2 个词典之间的差异,如交集的反面?

最佳答案

我们可以定义一个运算符来检查 2 个字典是否包含相同的键以及每个键是否包含相同的值。

值必须是平等的

首先我们需要使用泛型来要求字典的Value符合Equatable,否则我们将无法比较值。

代码

这是代码

func ==<Value:Equatable>(left: [String: Value], right: [String: Value]) -> Bool {
guard left.keys.count == right.keys.count else { return false }
let differenceFound = zip(left.keys.sort(), right.keys.sort()).contains { elm -> Bool in
let leftKey = elm.0
let rightKey = elm.1
return leftKey != rightKey || left[leftKey] != right[rightKey]
}
return !differenceFound
}

第一行验证字典的条目数是否相同,否则返回false

下一个代码块对两个字典的键进行排序,并比较每一对以查找键或值不同的对。

如果没有发现这种差异,则字典具有相同的键和值,因此它们是相等的。

例子

["a":1, "b": 2] == ["a":1, "b": 2] // true

当然,由于字典中的值没有顺序,因此以下内容仍然成立

["a":1, "b": 2] == ["b":2, "a": 1] // true

在下一个例子中,我们比较 2 个具有不同数量值的字典

["a":1, "b": 2] == ["a":1, "b": 2, "c": 3] // false

!= 运算符

由于我们定义了 == 运算符,Swift 给了我们 != 运算符(它只是返回 == 的反义词),所以我们也可以这样写

["a":1, "b": 2] != ["d":4] // true

简化版

同样的运算符也可以用这种更短的方式来写

func ==<Value:Equatable>(left: [String: Value], right: [String: Value]) -> Bool {
return
left.keys.count == right.keys.count &&
!zip(left.keys.sort(), right.keys.sort()).contains { $0 != $1 || left[$0] != right[$1] }
}

更新

现在给定 2 个字典 ab,你想执行 a.minus(b) 并得到一个包含的新字典所有 (key, value) 对在 a 中可用而在 b 中不可用。

这是代码

extension Dictionary where Key: Comparable, Value: Equatable {
func minus(dict: [Key:Value]) -> [Key:Value] {
let entriesInSelfAndNotInDict = filter { dict[$0.0] != self[$0.0] }
return entriesInSelfAndNotInDict.reduce([Key:Value]()) { (res, entry) -> [Key:Value] in
var res = res
res[entry.0] = entry.1
return res
}
}
}

例子

["a":1].minus(["a":2]) // ["a": 1]
["a":1].minus(["a":1]) // [:]
["a":1].minus(["a":1, "b":2]) // [:]
["a":1, "b": 2].minus(["a":1]) // ["b": 2]

关于swift - 如何提取字典之间的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38861786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com