我做了一个函数,从用户的输入中找到最接近的元素,这个元素越来越小。
为了解决这个问题,我使用了.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,…]数组中为450。。。。,1000页]。
打印应该返回(400,450,500)
但是,它返回1000450500。
即使我觉得逻辑是正确的。
最佳答案
您试图比较字符串而不是此处的数字:
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
进行排序,则必须首先对其进行排序。