I want to sort an array by strings first and then numbers. How do I do this?
A general trick for solving tricky sorts is to use #sort_by, with the block returning an array having the primary and secondary sort order (and, if you need it, tertiary, etc.)
a = ['foo', 'bar', '1', '2', '10'] b = a.sort_by do |s| if s =~ /^\d+$/ [2, $&.to_i] else [1, s] end end p b # => ["bar", "foo", "1", "2", "10"]
This works because of the way array comparison is defined by Ruby. The comparison is defined by the Array#<=> method:
Arrays are compared in an “element-wise” manner; the first element of ary is compared with the first one of other_ary using the <=> operator, then each of the second elements, etc… As soon as the result of any such comparison is non zero (i.e. the two corresponding elements are not equal), that result is returned for the whole array comparison.