その日の単価が最も高い穀物を割り出し、 Web で公告を出すように上司から頼まれている。 この性質を使って、ルビ緒は、 価格の入れ替えを行い価格の高いものをリストアップしながら出力するように、 プログラムを変更しようとを考えた。まずは文字列コード順表示を利用してみよう。
print("本日の高値の穀物について\n")
shop.values.sort.reverse.each{|item|
printf("%s\t%d\n", item, shop[item])
}
これでは結果を得られない。 shop.values.sort.reverse だけで得られる配列は確かに value の大きな順になっているが、 each method で指定したいものは hash 配列の key である。 shop.keys の配列が、 shop.values.sort の並べ替え順に並ぶようにしたい。 そこで、sort に詳しく指定をし、 value で入れ替えをするように、指定をすればよい。
配列.sort{|もとの配列の要素を代入する変数,並べ替え後の配列要素を代入する内部変数| 並び替えに使用したい個所の指定 <=> 並べ替え後の該当個所何を使って並べ替えるかをもとの配列と並べ変え後の配列の要素を代入する変数を使って表す}
もとの配列と並べ替え後の配列の要素を代入する内部変数は {} の中だけで使われる。 内部変数は名前を好きにつけてよい。 よって今の場合、これらの変数として prim, res を使うとすると、 prim, res は shop の key をとりだし、 prim と res に代入する。 その value は shop[key] と を代入することによって 得ることができる。shop[prim] と shop[res] の値について <=> で入れ替えを行う。これで value での入れ替えができる。
shop.keys.sort{
|prim,res|
shop[prim] <=> shop[res]
}.reverse.each{
:
と変更すればよい。 配列の入れ替えについて