Array与Tuple的Comparable扩展运行异常,比较结果不符预期
问题根源:Array的Comparable扩展逻辑错误
你的问题出在自定义的Array
错误分析
先看你写的Array扩展的<方法:
extension Array:Comparable where Element == Double { public static func < (lhs: Array<Element>, rhs: Array<Element>) -> Bool { let count = Swift.min(lhs.count, rhs.count) for i in 0..<count { if lhs[i] < rhs[i] { return true } } return false } }
这个实现的核心问题是:仅处理了lhs[i] < rhs[i]的情况,完全忽略了lhs[i] > rhs[i]的场景。
拿你提到的第一个错误案例来说:
- lhs数组:
[100.0, 0.0, 55.0] - rhs数组:
[55.0, 55.0, 300.0]
遍历第一个元素时,100.0 > 55.0,但你的代码没有任何处理,继续循环到第二个元素;此时0.0 < 55.0,代码直接返回true,错误地判定整个lhs数组小于rhs数组,和实际逻辑完全相反。
修复方案
正确的字典序比较逻辑应该是:
- 遍历两个数组的对应元素,找到第一个不相等的元素
- 基于该元素的大小关系返回结果
- 如果所有对应元素都相等,则比较数组的长度(更短的数组更小)
修改后的Array扩展代码如下:
extension Array: Comparable where Element == Double { public static func < (lhs: Array<Element>, rhs: Array<Element>) -> Bool { let minCount = Swift.min(lhs.count, rhs.count) for i in 0..<minCount { guard lhs[i] == rhs[i] else { return lhs[i] < rhs[i] } } // 所有对应元素相等,比较数组长度 return lhs.count < rhs.count } }
为什么Tuple的比较会异常
因为你的Tuple扩展的<方法直接依赖content数组的比较结果:
static func < (lhs: Tuple<T>, rhs: Tuple<T>) -> Bool { print ("compare \(lhs) \( lhs.content < rhs.content ? "<" : ">=") \(rhs)") return lhs.content < rhs.content }
Array的比较逻辑错误,自然会导致Tuple的比较结果不符合预期。修复Array的扩展后,Tuple的比较就能正常工作了。
内容的提问来源于stack exchange,提问作者Łukasz
相关产品推荐
相关产品推荐

