Iterieren über Hashes
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy. Lektion 34 von 56.
Hashes sind aufzählbar (enumerable), sodass Sie wie über Arrays über sie iterieren können. Es gibt drei gängige Muster, je nachdem, was Sie benötigen.
each übergibt Ihnen sowohl den Schlüssel als auch den Wert:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
puts "#{item}: $#{price}"
endeach_key durchläuft nur die Schlüssel:
prices.each_key { |k| puts k } # Apfel, Brot, Milcheach_value durchläuft nur die Werte:
prices.each_value { |v| puts v } # 1, 3, 4Und jede Enumerable-Methode, die Sie im letzten Kapitel gesehen haben, map, select, reduce: funktioniert auch mit Hashes. Sie erhalten pro Iteration einfach ein Schlüssel/Wert-Paar (oder ein 2-Elemente-Array):
prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}Aufgabe
MittelDu wendest einen Rabatt auf eine Preisliste an. Der Hash prices ist vorgegeben (Item-Symbol => Preis-Integer).
Lies eine Zeile der Eingabe ein: eine durch Kommas getrennte Liste von Elementen, die um 50% rabattiert werden sollen (übereinstimmend mit den Symbolen im Hash, nach Name).
Gib in dieser Reihenfolge aus:
- Eine Zeile pro Element im Format
<item>: $<final_price>, wobei der Endpreis der rabattierte Wert ist, wenn das Element in der Rabattliste enthalten ist, oder andernfalls der ursprüngliche Wert. Iteriere miteach. Elemente behalten ihre ursprüngliche Reihenfolge. Verwende Ganzzahldividion für den Rabatt (price / 2). Was: $<n>: die ursprüngliche Gesamtsumme (verwendevalues.sum)Now: $<n>: die Gesamtsumme nach dem Rabatt- Die Namen der Elemente, deren Endpreis immer noch über
2liegt, verbunden mit,(verwendeselect+keysauf dem neuen Hash)
Für die Eingabe bread,milk mit dem Standard-Hash lautet die Ausgabe:
apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheeseProbier es selbst
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# TODO: final-price Hash via each aufbauen; Zeilen, Summen, teure Artikel ausgeben
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Übe selbstständig: Online-Ruby-Compiler