Swift中如何按自定义条件查找数组的最小值?
自定义条件查找Swift数组最小值的问题
我定义了以下两个自定义类型,并基于它们创建了数组:
struct MyType { var id: String var value: Double } struct CustomObjectType { var size: CGFloat var myType: MyType }
数组内容如下:
let collection: Array<CustomObjectType> = [CustomObjectType(size: 350.0, myType: MyType(id: "A", value: 0)), CustomObjectType(size: 200.0, myType: MyType(id: "B", value: 1)), CustomObjectType(size: 170.0, myType: MyType(id: "C", value: 2)), CustomObjectType(size: 200.0, myType: MyType(id: "D", value: 3)), CustomObjectType(size: 200.0, myType: MyType(id: "E", value: 4))]
我尝试按myType.value查找数组的最大和最小元素,但查找最小值的逻辑无法正常工作:
let maxElement = collection.max(by: { lhs, rhs in if (lhs.myType.value < rhs.myType.value) { return true } else { return false } }) let minElement = collection.min(by: { lhs, rhs in if (lhs.myType.value > rhs.myType.value) { return true } else { return false } }) print(maxElement?.myType.id, maxElement?.myType.value) print(minElement?.myType.id, minElement?.myType.value)
运行结果:
Optional("E") Optional(4.0)
Optional("E") Optional(4.0)
minElement返回的是最大值对应的元素,而非最小值,请问该如何正确实现?
问题原因
Swift中min(by:)方法的闭包规则是:当左侧元素lhs应该被视为比右侧元素rhs更小时,返回true。你当前的闭包逻辑是lhs.myType.value > rhs.myType.value时返回true,这相当于告诉方法“左边元素比右边大的时候,左边排在前面”,最终min(by:)会选取排序后的最后一个元素,也就是最大值。
正确实现
只需要调整min(by:)的闭包逻辑,当lhs.myType.value小于rhs.myType.value时返回true即可:
let minElement = collection.min(by: { lhs, rhs in lhs.myType.value < rhs.myType.value })
或者更简洁的写法:
let minElement = collection.min(by: { $0.myType.value < $1.myType.value })
运行后minElement会正确返回id: "A", value: 0的元素,打印结果为:
Optional("A") Optional(0.0)
另外,你的max(by:)代码也可以简化为:
let maxElement = collection.max(by: { $0.myType.value < $1.myType.value })
内容的提问来源于stack exchange,提问作者swiftPunk
相关产品推荐
相关产品推荐

