Pet*_*ter 17
对数字和字符串数组进行排序,先将数字放在第一位,然后按顺序排在第二位,然后按顺序排序.
>> a = [1, 2, "b", "a"]
>> a.partition{|x| x.is_a? String}.map(&:sort).flatten
=> ["a", "b", 1, 2]
Way*_*rad 15
解决棘手排序的一般技巧是使用#sort_by,块返回一个具有主要和次要排序顺序的数组(如果需要,还可以使用三级等)
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"]
这是有效的,因为Ruby定义了数组比较的方式.比较由Array#<=>方法定义:
数组以"元素方式"进行比较; 使用<=>运算符将ary的第一个元素与other_ary的第一个元素进行比较,然后将每个第二个元素等进行比较......只要任何此类比较的结果不为零(即两个相应的元素不相等) ),为整个数组比较返回该结果.
a = ['1', '10', '100', '2', '42', 'hello', 'x1', 'x20', 'x100', '42x', '42y', '10.1.2', '10.10.2', '10.8.2']
a.map {|i| i.gsub(/\d+/) {|s| "%08d" % s.to_i } }.zip(a).sort.map{|x,y| y}
# => ["1", "2", "10", "10.1.2", "10.8.2", "10.10.2", "42", "42x", "42y", "100", "hello", "x1", "x20", "x100"]