大原です。

Hash を要素に持つような配列で、ある key の値を用いて sort しようと思い、
下のスクリプトのような sort を定義してみました。

これだと、名前だけ、年齢だけの sort ならうまく行くのですが、
「年齢で sort 、同じ年齢なら名前で sort」
のような、複数の key による sort はできません。

これは、Ruby が qsort() を使っているからなのだと思いますが、
複数 key による sort を簡単に実現することはできるでしょうか?



#!/usr/local/bin/ruby

class Array
  alias _sort sort
  def sort(key = 'name')
    self ._sort { |a,b|
      aa = a[key]; bb = b[key]
      if (aa && bb); aa <=> bb
      elsif (aa);    -1
      elsif (bb);     1
      else;           0
      end
    }
  end
end

ary0 = [
  { 'name' => 'angie',   'age' => '20' },
  { 'name' => 'charlie', 'age' => '19' },
  { 'name' => 'bob',     'age' => '20' },
]
p ary0

ary1 = ary0 .sort('name')
p ary1 # O.K.

ary2 = ary0 .sort('name') .sort('age')
p ary2 # N.G.

----
OHARA Shigeki (大原重樹) <os / iij.ad.jp>