Hashの反復処理
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部。レッスン 34/56。
ハッシュは列挙可能なので、配列と同じように反復処理できます。何をしたいかに応じて、一般的なパターンは3つあります。
each はキーと値の両方を渡します:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
puts "#{item}: $#{price}"
endeach_keyはキーだけを走査します。
prices.each_key { |k| puts k } # apple, bread, milkeach_valueは値だけを順に処理します:
prices.each_value { |v| puts v } # 1, 3, 4そして、前の章で見たすべてのEnumerableメソッド、map、select、reduceは、ハッシュにも作用します。各反復でキーと値のペア(または2要素の配列)を受け取るだけです:
prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}チャレンジ
中級価格リストにセールを適用します。ハッシュ prices が与えられます(item symbol => price integer)。
入力を1行読み込みます:カンマ区切りの50%割引対象のitems(ハッシュ内のシンボルと名前が一致するもの)。
次の順番で出力します:
- 各itemにつき、
<item>: $<final_price>形式で1行出力します。final priceは、そのitemがdiscountリストに含まれている場合は割引後の値、そうでない場合は元の値です。eachを使って反復します。itemsは元の順序を維持します。割引には整数除算を使用してください(price / 2)。 Was: $<n>:元の合計(values.sumを使用)Now: $<n>:割引後の合計- final priceが引き続き
2を上回るitemsの名前を、,で連結します(新しいハッシュに対してselect+keysを使用)
デフォルトのハッシュで入力が bread,milk の場合、出力は次のようになります:
apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheese自分で試してみよう
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# TODO: each で final-price ハッシュを構築する; 行、合計、高価なアイテムを出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ