Menu
Coddy logo textTech

Inventar-Momentaufnahme

Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy — Lektion 55 von 56.

Ein Inventarbericht, der Hashes, Enumerable-Ketten, group_by und ein wenig Formatierung verwendet.

challenge icon

Aufgabe

Mittel

Das Array inventory ist vorgegeben. Jedes Element ist ein Hash mit :name, :category, :qty und :price.

Geben Sie vier Zeilen aus:

  1. Der gesamte Inventarwert über alle Artikel hinweg (qty * price, summiert), ausgegeben als Ganzzahl.
  2. Die Kategorie mit der höchsten Anzahl an Artikeln im Format Top category: <name> (<count>). Bei Gleichstand entscheidet die alphabetische Reihenfolge des Kategorienamens.
  3. Namen der Artikel, die nicht vorrätig sind (qty == 0), alphabetisch sortiert und mit , verbunden. Falls keine vorhanden sind, geben Sie (none) aus.
  4. Namen der Top 3 der teuersten Artikel nach Einzelpreis, der höchste zuerst, verbunden mit , . Bei Gleichstand entscheidet der Name alphabetisch.

Für das Standard-Inventar lautet die Ausgabe:

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

Spickzettel

Arbeiten mit Arrays von Hashes unter Verwendung von Enumerable-Methoden:

# Summe mit Berechnung pro Element
inventory.sum { |item| item[:qty] * item[:price] }

# Nach einem Schlüssel gruppieren und zählen
groups = inventory.group_by { |item| item[:category] }
groups.max_by { |cat, items| [items.count, ...] }

# Filtern, sortieren und zusammenfügen
inventory.select { |item| item[:qty] == 0 }
         .map { |item| item[:name] }
         .sort
         .join(", ")

# Nach mehreren Kriterien sortieren (Gleichstände werden alphabetisch aufgelöst)
inventory.sort_by { |item| [-item[:price], item[:name]] }
         .first(3)
         .map { |item| item[:name] }
         .join(", ")

Gleichstände alphabetisch auflösen bei der Verwendung von max_by mit Zählungen:

# Höhere Anzahl gewinnt; bei Gleichstand alphabetisch zuerst (String für max_by negieren)
groups.max_by { |cat, items| [items.count, -cat.ord] }
# Oder min_by auf negierte Anzahl + natürliche String-Reihenfolge verwenden
groups.sort_by { |cat, items| [-items.count, cat] }.first

Probier es selbst

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: Gesamtwert, Top-Kategorie, Namen der nicht vorrätigen Artikel und Top 3 nach Preis ausgeben
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Programmfluss