[Ruby] テーブルっぽいデータをシンプルにソートする

by tanabe on September 14, 2007

Ruby でテーブルっぽいデータを任意の項目でソートしたいときの Tips 。こんなやり方できんのね。

a = [
  {:id => 4, :name => "abcde", :value => 50, :tag => "zzz"},
  {:id => 3, :name => "abcde", :value => 50, :tag => "zzz"},
  {:id => 3, :name => "abcde", :value => 30, :tag => "zzz"},
  {:id => 2, :name => "abcde", :value => 50, :tag => "zzz"},
  {:id => 2, :name => "bbcde", :value => 50, :tag => "zzz"},
  {:id => 1, :name => "abcde", :value => 50, :tag => "zzz"},
  {:id => 1, :name => "abcde", :value => 50, :tag => "azz"},
  {:id => 0, :name => "abcde", :value => 50, :tag => "zzz"} 
]

a.sort_by {|e| [e[:id], e[:name], e[:value], e[:tag]] }

# => 

[{:tag=>"zzz", :name=>"abcde", :value=>50, :id=>0},
 {:tag=>"azz", :name=>"abcde", :value=>50, :id=>1},
 {:tag=>"zzz", :name=>"abcde", :value=>50, :id=>1},
 {:tag=>"zzz", :name=>"abcde", :value=>50, :id=>2},
 {:tag=>"zzz", :name=>"bbcde", :value=>50, :id=>2},
 {:tag=>"zzz", :name=>"abcde", :value=>30, :id=>3},
 {:tag=>"zzz", :name=>"abcde", :value=>50, :id=>3},
 {:tag=>"zzz", :name=>"abcde", :value=>50, :id=>4}]

一応補足しておくと左にある項目から優先してソートされる。処理の順考えれば当然そうなるのは分かるけど、うまいなぁ。



この記事へのトラックバック
非常にお洒落な使い方 満足せる豚。眠たげなポチ。:[Ruby] テーブルっぽいデータをシンプルにソートする   ちょっとsort_byメソッドに注目してみる。 Rubyにはsortメソッドがあるが、何度も評価してしまうので効率が悪い。 sort_byだと一度全ての項目を評価してし
[Ruby]さっそく、sort_byを読んでみた。【I am Cruby!】at September 15, 2007 00:11