ハッシュをキーの値でソート

ハッシュをキーの値でソートしませう.
CSVファイルを読み込んで良い感じに処理できる部分も一緒にメモ.

#csvのサンプル
csv = [["ちんちん", "chinchin", 0.5], 
        ["ぺろぺろ", "peropero", 1.0],
        ["びゅるる", "byururu", 0.1],
        ["ぱこぱこ", "pakopako", 0.5]]

ono = Array.new
keys = [:kana,:roman,:sim]  #csvの項目に合わせる

csv.each_with_index do |row, i|
  ono[i] = Hash[*keys.zip(row).flatten]
end

#昇順ソート
ono_low2high = ono.sort do |a,b|
  a[:sim] <=> b[:sim]
end

#降順ソート
ono_high2low = ono.sort do |a,b|
  b[:sim] <=> a[:sim]
end

p "オリジナル"
ono.each do |row| p row end
p "昇順ソート"
ono_low2high.each do |row| p row end
p "降順ソート"
ono_high2low.each do |row |p row end
p "良い感じにアクセス"
ono.each do |row|
p "銀「#{row[:kana]}のアレは#{row[:sim]}…(///」"
end

実行結果.

"オリジナル"
{:kana=>"ちんちん", :roman=>"chinchin", :sim=>0.5}
{:kana=>"ぺろぺろ", :roman=>"peropero", :sim=>1.0}
{:kana=>"びゅるる", :roman=>"byururu", :sim=>0.1}
{:kana=>"ぱこぱこ", :roman=>"pakopako", :sim=>0.5}
"昇順ソート"
{:kana=>"びゅるる", :roman=>"byururu", :sim=>0.1}
{:kana=>"ちんちん", :roman=>"chinchin", :sim=>0.5}
{:kana=>"ぱこぱこ", :roman=>"pakopako", :sim=>0.5}
{:kana=>"ぺろぺろ", :roman=>"peropero", :sim=>1.0}
"降順ソート"
{:kana=>"ぺろぺろ", :roman=>"peropero", :sim=>1.0}
{:kana=>"ちんちん", :roman=>"chinchin", :sim=>0.5}
{:kana=>"ぱこぱこ", :roman=>"pakopako", :sim=>0.5}
{:kana=>"びゅるる", :roman=>"byururu", :sim=>0.1}
"良い感じにアクセス"
"銀「ちんちんの は0.5…(///」"
"銀「ぺろぺろの は1.0…(///」"
"銀「びゅるるの は0.1…(///」"
"銀「ぱこぱこの は0.5…(///」"

読み込むCSVファイルの項目が多くなってくるとキーでアクセスするのが便利です.*1CSVファイルの項目が増えたらkeysを調整するだけ.簡単.


同じ値の時にキーで昇順とかもできたような.
今はこれで.


オノマトペは楽しいのでみんな研究しましょう!(キリッ


参考にさせていただいたサイト
RubyでCSVを扱うときは配列をハッシュにすると便利な件 - wataradioの日記
mapee.jp

*1:ちょっと前までrow[13]とかやってた….