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