Menu
Coddy logo textTech

Verschachtelte Hashes

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

Ein Hash-Wert kann selbst ein Hash sein. Diese verschachtelte Struktur stellt strukturierte Datensätze in Ruby-Code typischerweise dar: ein einzelner Hash, der nach id (oder name) verschlüsselt ist und bei dem jeder Wert seine eigenen Felder enthält:

students = {
  "Alice" => { age: 20, grade: "A" },
  "Bob"   => { age: 22, grade: "B" }
}

Um auf einen verschachtelten Wert zuzugreifen, verkette die Abfragen:

puts students["Alice"][:age]    # 20
puts students["Bob"][:grade]    # B

Das Hinzufügen eines neuen Feldes zu einem der inneren Hashes funktioniert auf dieselbe Weise:

students["Alice"][:major] = "Math"
puts students["Alice"]
# {age: 20, grade: "A", major: "Math"}

Um sicher aus einem verschachtelten Hash zu lesen, dem auf jeder Ebene ein Schlüssel fehlen könnte, durchläuft dig die Kette und gibt nil zurück, wenn irgendwo auf dem Weg etwas fehlt:

students.dig("Alice", :grade)   # "A"
students.dig("Cara",  :grade)   # nil
challenge icon

Aufgabe

Mittel

Ein verschachtelter inventory-Hash ist gegeben: Jeder Schlüssel der obersten Ebene ist eine Abteilung, jeder innere Schlüssel ein Artikel und jeder innere Wert die vorrätige Menge (eine Ganzzahl).

Lies eine Eingabezeile ein: eine durch Kommas getrennte Liste von department/item-Suchpfaden.

Verwende für jeden Pfad in der angegebenen Reihenfolge dig, um ihn aufzulösen. Gib entweder Folgendes aus:

  • <department>/<item>: <qty>, wenn der Pfad existiert
  • <department>/<item>: missing, wenn dig nil zurückgibt

Gib nach jeder ausgegebenen Zeile zusätzlich eine Zusammenfassungszeile aus:

Total inventory: <sum>

Die Gesamtsumme ist die Summe jeder Menge über alle Abteilungen im ursprünglichen Hash hinweg. Verwende eine verschachtelte Iteration (jede Abteilung, dann jeder Artikel).

Für die Eingabe fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk lautet die Ausgabe:

fruits/apples: 12
meat/beef: 7
fruits/dragonfruit: missing
dairy/milk: 9
Total inventory: 39

Probier es selbst

inventory = {
  fruits: { apples: 12, bananas: 4 },
  meat:   { beef: 7, chicken: 5 },
  dairy:  { milk: 9, cheese: 2 }
}
lookups = gets.chomp.split(",")

# TODO: für jeden Lookup diggen und qty oder 'missing' ausgeben.
#       Then print 'Total inventory: <sum>' across all items.
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

Übe selbstständig: Online-Ruby-Compiler