Не получить максимальный элемент массива - PullRequest
0 голосов
/ 11 мая 2018

У меня есть строковый массив с именем prodIDArr, имеющий такие значения, как ...

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

Но когда я делаю что-то вроде этого ..

let maxVal = prodIDArr.max()

Я получаю значение maxVal как 9, а не 10.

В чем может быть причина этого ...?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы также можете сопоставить исходный массив строк с массивом 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()!)
0 голосов
/ 11 мая 2018

Это массив строк, и они сравниваются лексикографически :

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

Например "10" < "2", потому что начальные символы уже удовлетворить "1" < "2". (Подробности см. Например Что означает, что сравнения строк и символов в Swift не чувствительны к локали? .)

Лучшим решением будет использование массива целых чисел:

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")
...