Hash.new mit Standardwerten
Teil des Abschnitts Logik und Ablauf 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 und Ablauf
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