Iterowanie po haszach
Część sekcji Logika i przepływ programu ścieżki Ruby w Coddy. Lekcja 34 z 56.
Hashe są enumerowalne, więc możesz iterować po nich tak jak po tablicach. Istnieją trzy popularne wzorce, w zależności od tego, czego potrzebujesz.
each przekazuje zarówno klucz, jak i wartość:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
puts "#{item}: $#{price}"
endeach_key przechodzi tylko po kluczach:
prices.each_key { |k| puts k } # apple, bread, milkeach_value przechodzi tylko po wartościach:
prices.each_value { |v| puts v } # 1, 3, 4Każda metoda Enumerable, którą widziałeś w poprzednim rozdziale — map, select, reduce — działa też na hashach. Przy każdej iteracji otrzymujesz po prostu parę klucz/wartość (lub tablicę 2-elementową):
prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}Wyzwanie
ŚredniStosujesz wyprzedaż do listy cen. Podany jest hash prices (symbol elementu => cena jako liczba całkowita).
Wczytaj jeden wiersz danych wejściowych: listę elementów objętych 50-procentową zniżką, rozdzielonych przecinkami (dopasowanych według nazw symboli w hashu).
Wyświetl w tej kolejności:
- Jeden wiersz na element w formacie
<item>: $<final_price>, gdzie cena końcowa jest ceną po zniżce, jeśli element znajduje się na liście przecenionych, lub pierwotną ceną w przeciwnym razie. Iteruj za pomocąeach. Elementy zachowują swoją pierwotną kolejność. Przy obliczaniu zniżki użyj dzielenia całkowitoliczbowego (price / 2). Was: $<n>: pierwotna suma (użyjvalues.sum)Now: $<n>: suma po zniżce- Nazwy elementów, których końcowa cena nadal przekracza
2, połączone za pomocą,(użyjselect+keysna nowym hashu)
Dla danych wejściowych bread,milk i domyślnego hasha wynik to:
apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheeseSpróbuj swoich sił
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# TODO: utwórz hash cen końcowych za pomocą each; wypisz wiersze, sumy i drogie produkty
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Łańcuchy znaków w szczegółach
Przegląd metod łańcuchów znakówInterpolacja łańcuchów znakówIterowanie po łańcuchach znakówDzielenie i łączeniePowtórka – Tkacz łańcuchów znaków4Bloki, procki i lambdy
Czym jest blok?do..end a nawiasy klamroweSłowo kluczowe yieldParametry blokuProcki i lambdyPodsumowanie — własny iterator7Hashe, część 2
Hash.new z wartościami domyślnymiIterowanie po haszachZagnieżdżone haszeŁączenie i przekształcaniePowtórka — licznik częstotliwości10Projekt – ewidencja uczniów
Przegląd projektuDodawanie ucznia5Potęga Enumerable
Select i RejectŁączenie wywołań mapReduce / Injectcount, all?, any?, none?group_by i partitionsort_by, min_by, max_byPodsumowanie — potok danych8Zaawansowane podejmowanie decyzji
case z klasami i wyrażeniami regularnymiwhen z wieloma wartościamiOperator trójargumentowyInline if / unlessPowtórka – klasyfikator ocenPoćwicz samodzielnie: Kompilator Ruby online