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"] # nilHash.new(default) ändert das. Jeder fehlende Schlüssel gibt den Wert zurück, den Sie übergeben haben:
scores = Hash.new(0)
puts scores["Alice"] # 0Dies 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.
Aufgabe
EinfachLies 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: 20Wenn 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"] # 0Dies 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
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