【问题标题】:Sorting array returns wrong value排序数组返回错误值
【发布时间】:2019-07-10 06:46:38
【问题描述】:

我创建了一个函数,可以从用户的输入中找到越来越小的最接近的元素。

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

虽然我觉得逻辑是对的。

【问题讨论】:

  • 没错。就String 而言,"1000" 小于"400"。只需比较整数
  • 为什么你把你的号码投到String,你应该把它们投到IntDouble。编辑:正如@vadian 所说,这很可能是由于这个演员表
  • 我怀疑,谢谢我试试看!

标签: arrays swift sorting


【解决方案1】:

您正在尝试比较 strings 而不是 numbers 这里:

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不能保证排序,则必须先排序。

【讨论】:

  • 现在更有意义了,我这样做的原因是因为我从作为字符串的 csv 文件中获得的值数组。而且我不知道如何将它们作为整数。我猜是初学者的错误。但是谢谢你,这清楚了很多。为大家的帮助干杯!
【解决方案2】:

解决办法是不使用 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2012-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多