gpt4 book ai didi

arrays - 排序数组返回错误值

转载 作者:行者123 更新时间:2023-11-28 05:40:26 24 4
gpt4 key购买 nike

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

为了管理这个,我使用了 .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。

虽然我觉得逻辑是对的。

最佳答案

您正在尝试比较字符串,而不是此处的数字:

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

这意味着它们将按字典顺序或字典顺序 进行比较。在字典顺序中,1000 出现在 450 之前,因此它“小于”450。由于 1000 是数组中的最后一个元素,因此它被选为最后一个小于 450 的元素。

您应该将数组元素转换为 Int 并比较 Int:

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 不能保证被排序,你必须先对它进行排序。

关于arrays - 排序数组返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56964819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com