Nathan Long
Nathan Long

Reputation: 125912

How can I sort numbers as though they were words?

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?

Upvotes: 3

Views: 163

Answers (3)

Nakilon
Nakilon

Reputation: 35074

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

a.sort_by &:to_s

Upvotes: 7

Steven
Steven

Reputation: 18014

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.

Upvotes: 1

Matchu
Matchu

Reputation: 85792

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]

Upvotes: 2

Related Questions