Подтвердить что ты не робот

Сортировка массива строк по их Целочисленным значениям

Скажем, у меня есть несортированный массив от 1 до 10, как показано ниже...

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

Если я использую метод сортировки для этого массива, он возвращает это...

a.sort = ["1", "10", "2", "3", "4", "5", "6", "7", "8", "9"]

Как вы можете видеть, 10, появляется перед 2, что неверно. Как я могу сортировать эти числа так, чтобы 10 отображалось правильно?

EDIT: Привет, ребята, спасибо всем за ваши ответы. Я должен объяснить свою проблему немного лучше. Массив, который мне нужен, предназначен для прайс-листа электронной коммерции. Итак, массив выглядит следующим образом...

a = ["0-10", "11-20", "21-30", "31-40" etc.]

Таким образом, строки не могут быть преобразованы в целые числа. Я должен был поставить это, когда я написал вопрос. Я не думал, что в исправлении будет большая разница. Моя ошибка, я прошу прощения за это предположение! Как я могу отсортировать этот массив? Благодарю!

4b9b3361

Ответ 1

Я брошу еще один способ, потому что это самый короткий способ, который я могу придумать

a.sort_by(&:to_i)

Ответ 2

В вашем обновленном вопросе говорится:

array.sort_by {|elt| ary = elt.split("-").map(&:to_i); ary[0] + ary[1]}

даже geekier:

array.sort_by {|elt| ary = elt.split("-").map(&:to_i).inject(&:+)}

Ответ 3

Если вы предварительно конвертируете все строки в целые числа, они должны работать как ожидалось:

a.map(&:to_i).sort
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Ответ 4

a.sort { |a,b| a.to_i <=> b.to_i }

Ответ 5

Причина такого поведения заключается в том, что у вас есть массив строк, а используемый тип - строковый. Чтобы получить правильную, числовую сортировку, вам нужно преобразовать строки в числа или просто сохранить их как числа в первую очередь. Есть ли причина, по которой ваш массив заполняется такими строками:

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

Вместо таких чисел:

a = [3, 5, 8, 4, 1, 2, 9, 1, 7, 6]

?

Ответ 6

Дешевый способ состоял бы в том, чтобы заполнить нуль слева и сделать все цифры 2 разряда.

Ответ 7

Другой вариант, который можно использовать в вашем примере или в других массивах, таких как

a = ["teste", "test", "teste2", "tes3te", "10teste"]

является:

a.sort_by! {|s| s[/\d+/].to_i}