Menu
Coddy logo textTech

ハッシュの反復処理

CoddyのRubyジャーニー「ロジックとフロー」セクションの一部。レッスン 34/56。

ハッシュは Enumearble なので、配列と同じように反復処理(ループ)ができます。目的に応じて、主に3つのパターンがあります。

each はキーと値の両方を渡します:

prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
  puts "#{item}: $#{price}"
end

each_keyはキーだけを順に処理します:

prices.each_key { |k| puts k }   # apple, bread, milk

each_value は値だけを順に処理します:

prices.each_value { |v| puts v }   # 1, 3, 4

そして、前章で見たすべてのEnumerableメソッド(mapselectreduceなど)はハッシュに対しても動作します。各反復処理において、キーと値のペア(または2要素の配列)を受け取るだけです:

prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}
challenge icon

チャレンジ

中級

価格リストにセールを適用します。ハッシュ prices が与えられています(item シンボル => price 整数)。

1行の入力を読み込みます: 50%割引する itemsのカンマ区切りリスト(ハッシュ内のシンボル名と一致します)。

次の順番で出力してください:

  1. item について <item>: $<final_price> の形式で1行ずつ出力します。itemdiscount リストにある場合は割引後の価格、そうでない場合は元の価格です。each でループ処理してください。items の元の順序を維持します。割引には整数除算を使用してくださいprice / 2)。
  2. Was: $<n>: 元の合計金額(values.sum を使用)
  3. Now: $<n>: 割引後の合計金額
  4. 最終価格がまだ 2 より大きい items の名前を , で連結したもの(新しい hash に対して 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で最終価格ハッシュを構築する; 行、合計、高価なアイテムを出力する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: Rubyオンラインコンパイラ