如何将数字按照字母顺序排序?

3

Ruby的Array#sort默认会按数值大小升序排列数组中的数字:

[11, 12, 13, 112, 113, 124, 125, 127]

我想对数字数组进行排序,就像按字母顺序排列单词一样。
[11, 112, 113, 12, 124, 125, 127, 13]

我该怎么做?(最终,我想用哈希键来做到这一点,所以如果你愿意用这种方式回答,那也可以。)还有,这种排序类型有名称吗?
3个回答

7

你们都疯了))) 我有一个解决方案:

a.sort_by &:to_s

1
这是最短的解决方案。在 Ruby 1.9 中,您还可以使用相同的方法就地对数组进行排序:a.sort_by!(&:to_s) - psyho
иҜ·жіЁж„ҸпјҢsort_by!д»…йҖӮз”ЁдәҺ1.9.2+пјҲеңЁ1.9.1дёӯдёҚеӯҳеңЁпјүгҖӮ - Phrogz

2

有一种方法是将所有的值转换为字符串,然后再转换回来。

a = [11, 12, 13, 112, 113, 124, 125, 127]
a = a.map(&:to_s).sort.map(&:to_i)
p a # => [11, 112, 113, 12, 124, 125, 127, 13]

哈!这既简单又聪明。 :) - Nathan Long
@tokland:我的回答先到了;)不过,“sort_by”在将来肯定会成为我的工具箱的一部分! - Matchu

1

你可以传递一个代码块来进行排序,该代码块接受两个参数并返回自定义比较函数的结果。示例应该很清楚,但如果您有任何问题,请随时提问。

a = [11, 112, 113, 12, 124, 125, 127, 13]
new_a = a.sort do |x,y|
  "%{x}" <=> "%{y}"
end
puts new_a

一个注释:我怀疑你寻找这种解决方案的原因是你想要排序的对象本质上不是整数。子类化Integer可能是值得的,从语义上讲更加令人愉悦。虽然它显然会使实例化变得更困难,但至少对我来说感觉更正确。

1
我也喜欢这种方法,因为未来很容易扩展 :) +1 但就性能而言,最好的方法可能是在每个元素上进行两次转换,而不是每次比较时都将其转换为字符串。 - Matchu
1
实际上,差异微乎其微。我修改了我们的两个代码片段以实现更相似的结果(删除了输出语句并在我的方法调用中添加了!)。进行10,000次测试,我的代码执行时间为2.7秒,你的为2.8秒。请查看分析器输出 - Steven
你说得对,它们本质上并不是“整数”;事实上,我真的像使用字符串一样使用它们,所以我认为在我的情况下没有必要子类化“整数”。但我认为这是一个值得提出的好观点。 - Nathan Long
@Nathan:感谢你的赞美之词。大部分功劳应归功于 Ruby 库的设计者,他们使基本性能分析变得非常容易。你只需要添加 require 'profile' 即可。这真的让我回想起了 PHP 时代到处复制粘贴 microtime() 的日子。 - Steven
哦,天啊,require 'profile'。又是一种新工具加入我的工具箱了。我觉得我从这个问题中学到的比我做出的贡献还多 xD。 - Matchu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接