【问题标题】:Not getting max element of array没有得到数组的最大元素
【发布时间】:2018-05-11 07:49:33
【问题描述】:

我有一个名为prodIDArr 的字符串数组,其值如下...

["1","2","3","4","5","6","7","8","9","10"] 

但是当我这样做时..

let maxVal = prodIDArr.max()

我得到 maxVal 的值为 9 而不是 10。

这可能是什么原因...?

【问题讨论】:

  • 因为那是字符串,不是数字。
  • 但是@Martin R 是如何考虑直到 9 的值
  • 字符串按字典顺序进行比较:"1"
  • 对不起@MartinR 但是字典上的意思是什么......?
  • 这是元素(例如单词)在词典中出现的顺序en.wikipedia.org/wiki/Lexicographical_order

标签: arrays swift sorting


【解决方案1】:

那是一个字符串数组,它们被比较lexicographically

"1" < "10" < "2" < ... < "9" 

例如"10" &lt; "2",因为初始字符已经 满足"1" &lt; "2"。 (有关血腥细节,请参见例如 What does it mean that string and character comparisons in Swift are not locale-sensitive?.)

使用整数数组是最好的解决方案:

let prodIDArr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let maxId = prodIDArr.max()
print(maxId) // Optional(10)

如果这是不可能的,那么你可以强制进行数字比较

let prodIDArr = ["1","2","3","4","5","6","7","8","9","10"]
let maxId = prodIDArr.max(by: { $0.compare($1, options: .numeric) == .orderedAscending })
print(maxId) // Optional("10")

【讨论】:

    【解决方案2】:

    您还可以将原始字符串数组映射到 Int 数组

    let prodIDArr = ["1","2","3","4","5","6","7","8","9","10"]
    let prodNumArray = prodIDArr.map { input in Int(input)!} // or { Int($0)! }
    print(prodNumArray.max()!)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-11
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      相关资源
      最近更新 更多