Iterieren über Hashes
Teil des Abschnitts Logik & Programmfluss der Ruby-Journey von Coddy — Lektion 34 von 56.
Hashes sind aufzählbar (enumerable), daher können Sie sie genau wie Arrays iterieren. Es gibt drei gängige Muster, je nachdem, was Sie erreichen möchten.
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 } # apple, bread, milkeach_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 bei Hashes. Sie erhalten pro Iteration einfach ein Schlüssel/Wert-Paar (oder ein Array mit 2 Elementen):
prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}Aufgabe
MittelSie wenden einen Ausverkauf auf eine Preisliste an. Der Hash prices ist vorgegeben (Element-Symbol => Preis-Integer).
Lesen Sie eine Zeile als Eingabe ein: eine kommagetrennte Liste von Artikeln, die um 50 % reduziert werden sollen (entsprechend den Symbolen im Hash, nach Namen).
Geben Sie in dieser Reihenfolge Folgendes aus:
- Eine Zeile pro Artikel im Format
<item>: <item>: $<final_price>lt;final_price>, wobei der Endpreis der reduzierte Wert ist, wenn der Artikel in der Rabattliste enthalten ist, andernfalls der ursprüngliche Wert. Iterieren Sie miteach. Die Artikel behalten ihre ursprüngliche Reihenfolge bei. Verwenden Sie Ganzzahldivision für den Rabatt (price / 2). Was: Was: $<n>lt;n>: die ursprüngliche Gesamtsumme (verwenden Sievalues.sum)Now: Now: $<n>lt;n>: die Gesamtsumme nach dem Rabatt- Die Namen der Artikel, deren finaler Preis immer noch über
2liegt, verbunden mit,(verwenden Sieselect+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
cheeseSpickzettel
Iterieren über Hashes mit each, each_key, each_value:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each { |item, price| puts "#{item}: $#{price}" }
prices.each_key { |k| puts k }
prices.each_value { |v| puts v }Enumerable-Methoden wie map, select und reduce funktionieren auch mit Hashes und erhalten pro Iteration ein Schlüssel/Wert-Paar:
prices.select { |item, price| price > 2 }
# { bread: 3, milk: 4 }Nützliche Hash-Methoden: .values.sum, um alle Werte zu summieren, .keys, um ein Array der Schlüssel zu erhalten.
Probier es selbst
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# TODO: final-price Hash via each erstellen; 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