Menu
Coddy logo textTech

在庫スナップショット

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

ハッシュ、Enumerableチェーン、group_by、そして少しの書式設定を活用した在庫レポートです。

challenge icon

チャレンジ

中級

配列 inventory が与えられています。各アイテムは :name:category:qty、および :price を持つハッシュです。

以下の4行を出力してください:

  1. 全アイテムの在庫の総額(qty * price の合計)を整数として出力してください。
  2. アイテム数が最も多いカテゴリを、Top category: <name> (<count>) の形式で出力してください。同数の場合は、カテゴリ名のアルファベット順で決定します。
  3. 在庫切れqty == 0)のアイテムの名前をアルファベット順にソートし、, でつなげて出力してください。該当するものがない場合は、(none) と出力してください。
  4. 単価が高い上位3つのアイテムの名前を、価格の高い順に , でつなげて出力してください。価格が同じ場合は、名前のアルファベット順で決定します。

デフォルトの inventory の場合、出力は以下のようになります:

232
Top category: food (3)
milk
chair, lamp, milk

チートシート

Enumerable メソッドを使用してハッシュの配列を操作する:

# 要素ごとの計算結果を合計する
inventory.sum { |item| item[:qty] * item[:price] }

# キーでグループ化してカウントする
groups = inventory.group_by { |item| item[:category] }
groups.max_by { |cat, items| [items.count, ...] }

# フィルタリング、ソート、結合
inventory.select { |item| item[:qty] == 0 }
         .map { |item| item[:name] }
         .sort
         .join(", ")

# 複数の基準でソート(同点の場合はアルファベット順)
inventory.sort_by { |item| [-item[:price], item[:name]] }
         .first(3)
         .map { |item| item[:name] }
         .join(", ")

max_by でカウントを使用する際、同点の場合にアルファベット順で決着をつける:

# カウントが多い方が優先。同点の場合はアルファベット順で先のもの(max_by 用に数値を調整)
groups.max_by { |cat, items| [items.count, -cat.ord] }
# または、マイナスのカウントと通常の文字列順序を使用して sort_by を行う
groups.sort_by { |cat, items| [-items.count, cat] }.first

自分で試してみよう

inventory = [
  { name: "apple",  category: "food",        qty: 10, price: 2 },
  { name: "bread",  category: "food",        qty: 4,  price: 3 },
  { name: "milk",   category: "food",        qty: 0,  price: 4 },
  { name: "chair",  category: "furniture",   qty: 2,  price: 35 },
  { name: "lamp",   category: "furniture",   qty: 5,  price: 20 },
  { name: "pencil", category: "stationery",  qty: 30, price: 1 }
]

# TODO: 合計金額、最も多いカテゴリー、在庫切れの商品名、価格の高い順トップ3を表示する
quiz icon腕試し

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

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