Menu
CoddyTech

Verschachtelte Hashes

Teil des Abschnitts Logik und Ablauf 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 und Ablauf

Übe selbstständig: Online-Ruby-Compiler