我做了一个函数,从用户的输入中找到最接近的元素,这个元素越来越小。
为了解决这个问题,我使用了.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)})!

这意味着他们将在字典顺序或词典编纂中进行比较。按字典顺序,1000450之前,所以它是“小于”450。因为1000是数组中的最后一个元素,所以它被选为小于450的最后一个元素。
相反,您应该将数组元素转换为Int并比较Ints:
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进行排序,则必须首先对其进行排序。

10-08 07:28