Hash.new mit Standardwerten
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy. Lektion 33 von 56.
Standardmäßig gibt die Suche nach einem fehlenden Schlüssel 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 du übergeben hast:
scores = Hash.new(0)
puts scores["Alice"] # 0Dies ist die sauberste Art, einen Zähler zu schreiben. Du musst vor dem Erhöhen nicht prüfen, ob if scores[name].nil? gilt:
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, speichert den Schlüssel jedoch nicht, wenn du ihn liest. Der Hash bleibt leer, bis du eine Zuweisung vornimmst. Sobald du also counts[letter] += 1 schreibst, wird der Schlüssel mit dem neuen Wert hinzugefügt.
Aufgabe
EinfachLies eine durch Kommas getrennte Liste von category:amount-Einträgen (z. B. food:12,gas:30,food:8,books:25,gas:15). Erstelle mit Hash.new(0) einen Hash mit den Gesamtsummen pro Kategorie und gib anschließend nur die Kategorien aus, deren Summe mindestens 20 beträgt, eine pro Zeile, nach der Summe absteigend sortiert:
<category>: <total>Für die obige Beispiel-Eingabe lautet die Ausgabe:
gas: 45
books: 25
food: 20Wenn keine Kategorie 20 erreicht, gib nichts aus.
Probier es selbst
entries = gets.chomp.split(",")
# TODO: totals = Hash.new(0); Betrag pro Kategorie akkumulieren;
# dann Kategorien mit total >= 20 ausgeben, sortiert nach total desc
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
Überblick über String-MethodenString-InterpolationStrings durchlaufenSplitten und VerbindenRückblick – String Weaver4Blocks, Procs & Lambdas
Was ist ein Block?do..end vs. geschweifte KlammernDas Schlüsselwort yieldBlock-ParameterProcs und LambdasRückblick – Benutzerdefinierter Iterator7Hashes Teil 2
Hash.new mit StandardwertenHashes durchlaufenVerschachtelte HashesZusammenführen und TransformierenRückblick – Häufigkeitszähler2Bereiche
Was ist ein Bereich?BereichsmethodenBereiche in Case / WhenWiederholung – Übung zu Bereichen5Das Enumerable-Kraftpaket
Select und RejectMap verkettenReduce / Injectcount, all?, any?, none?group_by und partitionsort_by, min_by, max_byZusammenfassung – Datenpipeline8Fortgeschrittene Entscheidungsfindung
Case mit Klassen & Regexwhen mit mehreren WertenTernärer OperatorInline-if / unlessRückblick – NotenklassifiziererÜbe selbstständig: Online-Ruby-Compiler