2011年12月14日水曜日

[ruby] ハッシュの配列を複数のキーでソートする

実行環境:
ruby 1.9.3
rubyでハッシュの配列を複数のキーでソートする場合のやり方です。
多次元配列やオブジェクトの配列も同じ考え方でいけます。

たとえば、以下のようなハッシュの配列があったとします。
arr = [ { :name => "Dave",  :age => 7, :birthday => '12/05' },
        { :name => "Carol", :age => 5, :birthday => '08/23' },
        { :name => "Alice", :age => 6, :birthday => '05/18' },
        { :name => "Bob",   :age => 5, :birthday => '01/31' } ]

これを :age と :birthday の2つの値でソートすることを考えます。
あくまでも例なので :birthday に年まで入れろや、という突っ込みはなしで(^^;


まずは基本。:ageの値をキーとしてソートするなら
arr.sort!{ |a, b| a[:age] <=> b[:age] }
こんな感じですよね。


次に :age と :birthday の2つの値をキーでソートします。
言いかえれば、まず :age の値で比べて :age が同じなら :birthday の順で並び変える、ということです。
arr.sort!{ |a, b| (a[:age] == b[:age]) ? a[:birthday] <=> b[:birthday] : a[:age] <=> b[:age] }
こんな感じでしょうか。
:age の値の比較を2回やっているのがちょっとカッコ悪いですかね。

1 件のコメント:

  1. newsh = arr.sort{ |a, b| ( (a[:age] <=> b[:age]).nonzero? || (a[:birthday] <=> b[:bir thday])) }
    ではどうでしょうか

    返信削除