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