ハッシュのソート別法

sortメソッドでは、ハッシュも直接並べ換えることができる。 ソート規準ブロックでの引数の利用のしかたを工夫するだけで良い。

forループでハッシュから要素を一個ずつ取り出すと 以下のようになる。

price  = {"りんご" => 150, "みかん" => 30,
          "いちご" => 20,  "梨"     => 120}
for item in price do
  p item
end
↓
["りんご", 150]
["いちご", 20]
["みかん", 30]
["梨", 120]

ハッシュから要素を一個ずつ取り出すと、[key, value] と並んだ配列が出てくる。これを踏まえてprice変数に 入っている商品を、値段の大小で並べ替えよう。

price.sort {|x, y| ??? <=> ???}

とした場合、ソート規準ブロックの仮引数 x, y には

["りんご", 150]
["いちご", 20]
["みかん", 30]
["梨", 120]

のいずれかが代入されるので、その中から値段を取り出すには配列の 第1要素(2個目)を参照すれば良い。したがって、

price.sort {|x, y| x[1] <=> y[1]}

で値段の小さい順に並べ換えできる。

sortメソッドは並べ換えた結果を 配列として返すので以下のようになる。

price.sort{|x, y| x[1]<=>y[1]}
 =>[["いちご", 20], ["みかん", 30], ["梨", 120], ["りんご", 150]]

ここから、2つずつ値を取り出す。

price  = {
  "りんご" => 150,
  "みかん" => 30,
  "いちご" => 20,
  "梨"     => 120
}
price.sort {|x, y| x[1] <=> y[1]}.each do |f, p|
  printf("%s は %d円です。\n", f, p)
end

本日の目次