我制作了一个函数,该函数可以根据用户的输入查找越来越小的元素。
为解决这个问题,我使用了.last()
和.first()
方法。
func closestNumbers(_ column: [String], value: Int) {
// Gets the closest element in array to userInput
let userInput = value
let rangeA = column
let left = rangeA.last(where: { $0 <= String(userInput)})! // last element that is less or equal to userInput
let right = rangeA.first(where: { $0 >= String(userInput)})! // first element that is bigger or the same as userInput
print(left, userInput, right)
// prints left <= userInput >= right
}
示例:如果userInput在[100,200,....,1000]数组中为450。
打印结果应返回(400、450、500)
但是,它返回1000、450、500。
即使我认为逻辑是正确的。
答案 0 :(得分:1)
您要在此处比较字符串而不是数字:
let left = rangeA.last(where: { $0 <= String(userInput)})!
let right = rangeA.first(where: { $0 >= String(userInput)})!
这意味着将按照字典顺序或字典顺序对它们进行比较。按照字典顺序,1000
在450
之前,因此它“小于” 450
。而且由于1000
是数组中的最后一个元素,因此它被选择为小于450的最后一个元素。
您应该将数组元素转换为Int
并比较Int
s:
let left = rangeA.last(where: { Int($0)! <= userInput})!
let right = rangeA.first(where: { Int($0)! >= userInput})!
实际上,为什么不仅仅将参数类型设为[Int]
而不是[String]
?
func closestNumbers(_ column: [Int], value: Int) {
那么您根本不需要任何转换。
请注意,这仅在对rangeA
进行排序时才有效。如果不能保证rangeA
进行排序,则必须先对其进行排序。
答案 1 :(得分:0)
解决方案是不使用String而是使用Int
func closestNumbers(_ column: [Int], value: Int) -> (Int?, Int, Int?) {
return (column.last(where: { $0 < value}), value, column.first(where: { $0 > value}))
}
let arr = Array(0...20).map { $0 * 50 }
print(closestNumbers(arr, value: 450))