Ответ 1
Я брошу еще один способ, потому что это самый короткий способ, который я могу придумать
a.sort_by(&:to_i)
Скажем, у меня есть несортированный массив от 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.]
Таким образом, строки не могут быть преобразованы в целые числа. Я должен был поставить это, когда я написал вопрос. Я не думал, что в исправлении будет большая разница. Моя ошибка, я прошу прощения за это предположение! Как я могу отсортировать этот массив? Благодарю!
Я брошу еще один способ, потому что это самый короткий способ, который я могу придумать
a.sort_by(&:to_i)
В вашем обновленном вопросе говорится:
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(&:+)}
Если вы предварительно конвертируете все строки в целые числа, они должны работать как ожидалось:
a.map(&:to_i).sort
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a.sort { |a,b| a.to_i <=> b.to_i }
Причина такого поведения заключается в том, что у вас есть массив строк, а используемый тип - строковый. Чтобы получить правильную, числовую сортировку, вам нужно преобразовать строки в числа или просто сохранить их как числа в первую очередь. Есть ли причина, по которой ваш массив заполняется такими строками:
a = ["3", "5", "8", "4", "1", "2", "9", "10", "7", "6"]
Вместо таких чисел:
a = [3, 5, 8, 4, 1, 2, 9, 1, 7, 6]
?
Дешевый способ состоял бы в том, чтобы заполнить нуль слева и сделать все цифры 2 разряда.
Другой вариант, который можно использовать в вашем примере или в других массивах, таких как
a = ["teste", "test", "teste2", "tes3te", "10teste"]
является:
a.sort_by! {|s| s[/\d+/].to_i}