Menu
Coddy logo textTech

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}"
end

each_key durchläuft nur die Schlüssel:

prices.each_key { |k| puts k }   # apple, bread, milk

each_value durchläuft nur die Werte:

prices.each_value { |v| puts v }   # 1, 3, 4

Und 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}
challenge icon

Aufgabe

Mittel

Sie 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:

  1. 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 mit each. Die Artikel behalten ihre ursprüngliche Reihenfolge bei. Verwenden Sie Ganzzahldivision für den Rabatt (price / 2).
  2. Was: Was: $<n>lt;n>: die ursprüngliche Gesamtsumme (verwenden Sie values.sum)
  3. Now: Now: $<n>lt;n>: die Gesamtsumme nach dem Rabatt
  4. Die Namen der Artikel, deren finaler Preis immer noch über 2 liegt, verbunden mit , (verwenden Sie select + keys auf 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
cheese

Spickzettel

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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Programmfluss