开发者

How can I sort numbers as though they were words?

开发者 https://www.devze.com 2023-02-06 04:35 出处:网络
Ruby\'s Array#sort will, by default, sort numbers like this, in order of their value: [11, 12, 13, 112, 113, 124, 125, 127]

Ruby's Array#sort will, by default, sort numbers like this, in order of their value:

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

I'd like to sort an array of numbers like this, as though they were words being alphabetized:开发者_运维问答

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

How can I do this? (Ultimately, I want to do this with Hash keys, so if you want to answer that way instead, that's fine.) Also, is there a name for this type of sort?


You are all crqzy ))) I have a such solution:

a.sort_by &:to_s


Well, one way is to convert all of the values to strings, then convert them back.

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]


You can pass in a block to sort that accepts two arguments and returns the result of your own custom-defined comparison function. The example should speak for itself, but should you have any questions, feel free to ask.

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

A note: I suspect that the reason you're looking for this sort of solution is because the objects you want sorted are not Integers at heart. It might be worthwhile and semantically more pleasing to subclass Integer. Although it will obviously make instantiation harder, it feels more correct, at least to me.

0

精彩评论

暂无评论...
验证码 换一张
取 消