なるほど、と思ったので自分の勉強メモ。rubyにおけるハッシュのソートについての考え方。
rubyでハッシュにいろいろデータを入れて取り出すとき、ソートして取り出したいよね、ということがよくある。
そうすると、ハッシュをソートしたいという発想が当然出てくるのだけれど、RubyにはHash::sortというメソッドそのものがない。
なぜか。そもそもハッシュというのは順序が保存されないもの([ruby-list:43857] Hashへの生成順は保障されないのか?)。なので、順番を並べ替えるソートという考え方に意味がない。(ソートしたってその順番通りに並ぶ保証がないのだから)
じゃあ、ハッシュのデータを順序どおりに取り出すときどうするか?そういうときは、順序が保存される配列に変換してからソートを行う。
irb(main):018:0> var = { irb(main):019:1* 2=>"2", irb(main):020:1* 1=>"1", irb(main):021:1* 3=>"3" irb(main):022:1> } => {1=>"1", 2=>"2", 3=>"3"}
#ね、順序が変わったでしょ?
irb(main):023:0> var_sorted_array = var.to_a.sort{|a,b| irb(main):024:1* (a[0] b[0])} => [[1, "1"], [2, "2"], [3, "3"]]
いったん配列にしたものをソートすることで、順序を決めて取り出すことができる。
使うときはこんなふうに。
irb(main):030:0> var_sorted_array.each{|var| irb(main):031:1* p var[0] irb(main):032:1> p var[1] irb(main):033:1> } 1 "1" 2 "2" 3 "3"