ruby: 2008年6月アーカイブ

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


このアーカイブについて

このページには、 2008年6月 以降に書かれたブログ記事のうち ruby カテゴリに属しているものが含まれています。

前のアーカイブは ruby: 2007年11月 です。

次のアーカイブは ruby: 2008年7月 です。

最近のコンテンツは インデックスページ で見られます。過去に書かれたものは アーカイブのページ で見られます。

Powered by
Movable Type