Ruby'sort'将1XX值放在数组中的8X值之前

时间:2013-05-15 15:16:30

标签: ruby arrays sorting

我有这个简单的数组,我想从较低的数字到更高的数字订购:

"80", "84", "115", "98", "128", "131", "132", "128", "139", "140", "141", "142", "142", "124", "144", "145", "148", "149", "152", "97"

要对它进行排序,我使用sort,但输出不是我期望的输出。

这是我的代码:

def try_order
  unordered = ["80", "84", "115", "98", "128", "131", 
               "132", "128", "139", "140", "141", "142", 
               "142", "124", "144", "145", "148", "149", "152", "97"]
  p "Unordered list is #{unordered}."

  ordered = unordered.sort

  p "Ordered list is #{ordered}."
end

try_order

输出如下:

"Unordered list is 80841159812813113212813914014114214212414414514814915297."
"Ordered list is 11512412812813113213914014114214214414514814915280849798."

正如您所看到的,有序列表不是以较低的数字开头,即80,而是将3位数字首先从1开始。

我有什么遗失的吗?

2 个答案:

答案 0 :(得分:7)

这是因为你要排序字符串,而不是数字。转换为整数进行排序。

unordered.map(&:to_i).sort.map(&:to_s)

如果将原始数组保留为数字,那么就可以消除问题(并获得更好的排序性能(因为现在您不必将数组映射两次)。)

答案 1 :(得分:6)

所有你需要的是:

unordered.sort_by(&:to_i)