在Swift中,我有两个数组,我从最大到最小排序,这意味着数组的值是Comparable
。我想定义一种自定义方式来比较两个数组,以便说一个是“小于”另一个。具有较少元素的数组总是小于较大的数组。我提出的工作正常,但<
运算符看起来太笨重了。它只是感觉应该有一些方法来浓缩它,或者有一个内置函数或内置函数的组合,将实现我想要的。这就是我所拥有的:
func <<T where T: Comparable>(lhs: [T], rhs: [T]) -> Bool {
if lhs.count < rhs.count {
return true
}
for i in 0..<lhs.count {
if lhs[i] > rhs[i] {
return false
}
}
return true
}
let first = [9, 8, 7, 6, 4]
let second = [9, 8, 7, 6, 5]
let third = [8, 7, 6, 5, 4]
let fourth = [9, 8, 7, 6]
let firstSecondComp: Bool = first < second // true
let secondFirstComp: Bool = second < first // false
let secondThirdComp: Bool = second < third // false
let thirdSecondComp: Bool = third < second // true
let firstThirdComp: Bool = first < third // false
let thirdFirstComp: Bool = third < first // true
let fourthFirstComp: Bool = fourth < first // true
let fourthSecondComp: Bool = fourth < second // true
let fourthThirdComp: Bool = fourth < third // true
有什么方法可以改善比较函数的主体吗?
修复Leo Dabus指出的崩溃并包括Martin R的回答:
func <<T where T: Comparable>(lhs: [T], rhs: [T]) -> Bool {
if lhs.count < rhs.count {
return true
}
else if lhs.count > rhs.count {
return false
}
return !zip(lhs, rhs).contains { $0 > $1 }
}
答案 0 :(得分:6)
您的比较功能可以写成
func <<T where T: Comparable>(lhs: [T], rhs: [T]) -> Bool {
return lhs.count < rhs.count || !zip(lhs, rhs).contains { $0 > $1 }
}
此处zip()
返回两者的对的枚举
数组,然后检查第一个是否有一个元素
array大于第二个数组中的对应元素。
这为您的所有测试用例提供了相同的结果。
正如@Leo正确注意到的那样,如果是第一个,你的功能会崩溃
数组比第二个元素多。使用zip()
,
额外的元素被忽略。
备注:如果第一个数组较长,则比较应返回false 然后你可以把它写成
return lhs.count <= rhs.count && (lhs.count < rhs.count || !zip(lhs, rhs).contains { $0 > $1 })