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

each_key durchläuft nur die Schlüssel:

prices.each_key { |k| puts k }   # Apfel, Brot, Milch

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

Aufgabe

Mittel

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

  1. 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 mit each. Elemente behalten ihre ursprüngliche Reihenfolge. Verwende Ganzzahldividion für den Rabatt (price / 2).
  2. Was: $<n>: die ursprüngliche Gesamtsumme (verwende values.sum)
  3. Now: $<n>: die Gesamtsumme nach dem Rabatt
  4. Die Namen der Elemente, deren Endpreis immer noch über 2 liegt, verbunden mit , (verwende 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

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 aufbauen; 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

Übe selbstständig: Online-Ruby-Compiler