[ruby]ハッシュのソートについてのメモ

なるほど、と思ったので自分の勉強メモ。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"

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です