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.
Aufgabe
MittelDas Array inventory ist vorgegeben. Jedes Element ist ein Hash mit :name, :category, :qty und :price.
Geben Sie vier Zeilen aus:
- Der gesamte Inventarwert über alle Artikel hinweg (
qty * price, summiert), ausgegeben als Ganzzahl. - Die Kategorie mit der höchsten Anzahl an Artikeln im Format
Top category: <name> (<count>). Bei Gleichstand entscheidet die alphabetische Reihenfolge des Kategorienamens. - Namen der Artikel, die nicht vorrätig sind (
qty == 0), alphabetisch sortiert und mit,verbunden. Falls keine vorhanden sind, geben Sie(none)aus. - 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, milkSpickzettel
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
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Programmfluss
1Strings im Detail
String-Methoden im ÜberblickString-InterpolationIterieren über StringsSplit und JoinRückblick – String Weaver4Blöcke, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas yield-SchlüsselwortBlock-ParameterProcs und LambdasZusammenfassung – Eigener Iterator7Hashes Teil 2
Hash.new mit StandardwertenIterieren über HashesVerschachtelte HashesZusammenführen und TransformierenRückblick – Häufigkeitszähler10Projekt - Studentenverwaltung
ProjektübersichtStudent hinzufügen5Enumerable-Kraftpaket
Select und RejectMap-VerkettungReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Data Pipeline8Fortgeschrittene Entscheidungslogik
Case mit Klassen & RegexMulti-Value whenTernärer OperatorInline if / unlessRückblick – Noten-Klassifizierer