排序数组返回错误值

时间:2019-07-10 06:46:38

标签: arrays swift sorting

我制作了一个函数,该函数可以根据用户的输入查找越来越小的元素。

为解决这个问题,我使用了.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。

即使我认为逻辑是正确的。

2 个答案:

答案 0 :(得分:1)

您要在此处比较字符串而不是数字

let left = rangeA.last(where: { $0  <=  String(userInput)})!
let right = rangeA.first(where: { $0 >= String(userInput)})!

这意味着将按照字典顺序或字典顺序对它们进行比较。按照字典顺序,1000450之前,因此它“小于” 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))