Menu
Coddy logo textTech

Hash.new mit Standardwerten

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

Standardmäßig gibt das Nachschlagen eines fehlenden Schlüssels in einem Hash nil zurück:

scores = {}
puts scores["Alice"]   # nil

Hash.new(default) ändert das. Jeder fehlende Schlüssel gibt den Wert zurück, den Sie übergeben haben:

scores = Hash.new(0)
puts scores["Alice"]   # 0

Dies ist der sauberste Weg, einen Zähler zu schreiben. Sie müssen nicht erst if scores[name].nil? prüfen, bevor Sie inkrementieren:

counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
  counts[letter] += 1
end
puts counts.inspect   # {"a"=>3, "b"=>1, "c"=>1}

Wichtig: Hash.new(0) setzt den Standardwert auf 0, aber speichert nicht den Schlüssel, wenn Sie ihn lesen. Der Hash bleibt leer, bis Sie eine Zuweisung vornehmen. Sobald Sie also counts[letter] += 1 schreiben, wird der Schlüssel mit dem neuen Wert hinzugefügt.

challenge icon

Aufgabe

Einfach

Lies eine kommagetrennte Liste von category:amount Einträgen ein (z. B. food:12,gas:30,food:8,books:25,gas:15). Erstelle einen Hash der Gesamtsummen pro Kategorie unter Verwendung von Hash.new(0) und gib dann nur die Kategorien aus, deren Gesamtsumme mindestens 20 beträgt, eine pro Zeile, sortiert nach der Gesamtsumme absteigend:

<category>: <total>

Für das obige Eingabebeispiel lautet die Ausgabe:

gas: 45
books: 25
food: 20

Wenn keine Kategorie 20 erreicht, gib nichts aus.

Spickzettel

Standardmäßig geben fehlende Hash-Schlüssel nil zurück. Verwenden Sie Hash.new(default), um stattdessen einen anderen Standardwert zurückzugeben:

scores = Hash.new(0)
puts scores["Alice"]   # 0

Dies macht Zähler sauber – es ist nicht nötig, vor dem Inkrementieren auf nil zu prüfen:

counts = Hash.new(0)
["a", "b", "a"].each do |letter|
  counts[letter] += 1
end
# {"a"=>2, "b"=>1}

Hinweis: Das Lesen eines fehlenden Schlüssels speichert diesen nicht. Der Schlüssel wird erst hinzugefügt, wenn Sie einen Wert zuweisen (z. B. +=).

Probier es selbst

entries = gets.chomp.split(",")

# TODO: totals = Hash.new(0); Betrag pro Kategorie akkumulieren;
#       dann Kategorien mit Summe >= 20 ausgeben, sortiert nach Summe absteigend
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