ハッシュのソート

Hash#sort (実際は Enumerable)は、デフォルトで "ORDER BY key" だと嬉しい。よくやる操作だから。

#!/usr/bin/ruby

class Symbol
   def <=> b
      self.to_s <=> b.to_s
   end
end

class Hash
   alias :default_sort :sort
   def sort &b
      unless b.nil?
         self.default_sort &b
      else
         self.to_a.sort { |a,b|
            a[0] <=> b[0]
         }
      end
   end
end

h = {
   :e => 1,
   :d => 2,
   :c => 3,
   :b => 4,
   :a => 5,
}

if __FILE__ == $0
   puts "Not sorted"
   h.each do |k,v|
      puts "\t" + [k,v].join(": ")
   end

   puts "ORDER BY key"
   h.sort.each do |k,v|
      puts "\t" + [k,v].join(": ")
   end

   puts "ORDER BY val"
   h.sort{|a,b| a[1] <=> b[1]}.each do |k,v|
      puts "\t" + [k,v].join(": ")
   end
end

Symbol の <=> も標準であると嬉しいかも。1.9 とか知らん。