Итерация по хешам
Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 34 из 56.
Хеши являются перечисляемыми, поэтому вы можете перебирать их точно так же, как массивы. Существует три распространенных шаблона в зависимости от того, что вам нужно.
each передает вам и ключ, и значение:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
puts "#{item}: $#{price}"
endeach_key перебирает только ключи:
prices.each_key { |k| puts k } # apple, bread, milkeach_value перебирает только значения:
prices.each_value { |v| puts v } # 1, 3, 4И каждый метод Enumerable, который вы видели в прошлой главе, map, select, reduce: также работает с хешами. Вы просто получаете пару ключ/значение (или массив из 2 элементов) на каждой итерации:
prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}Задание
СреднеВы применяете распродажу к прайс-листу. Дан хеш prices (символ товара => целое число цены).
Прочитайте одну строку ввода: список через запятую товаров, на которые действует скидка 50% (соответствующих символам в хеше по имени).
Выведите в следующем порядке:
- По одной строке на каждый товар в формате
<item>: <item>: $<final_price>lt;final_price>, где итоговая цена — это цена со скидкой, если товар есть в списке скидок, или исходная цена в противном случае. Используйтеeachдля итерации. Товары сохраняют свой исходный порядок. Используйте целочисленное деление для расчета скидки (price / 2). Was: Was: $<n>lt;n>: исходная общая сумма (используйтеvalues.sum)Now: Now: $<n>lt;n>: общая сумма после применения скидок- Названия товаров, чья итоговая цена по-прежнему выше
2, через запятую с пробелом,(используйтеselect+keysдля нового хеша)
Для ввода bread,milk с хешем по умолчанию вывод будет следующим:
apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheeseШпаргалка
Итерация по хешам с помощью 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, такие как map, select и reduce, также работают с хешами, получая пару ключ/значение на каждой итерации:
prices.select { |item, price| price > 2 }
# { bread: 3, milk: 4 }Полезные методы хешей: .values.sum для суммирования всех значений, .keys для получения массива ключей.
Попробуйте сами
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# TODO: создать хеш итоговых цен через each; вывести строки, итоги, дорогие товары
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Обзор методов строкИнтерполяция строкИтерация по строкамSplit и JoinИтоги — String Weaver4Блоки, Proc и лямбды
Что такое блок?do..end против фигурных скобокКлючевое слово yieldПараметры блокаProc и лямбдыИтоги: пользовательский итератор7Хеши. Часть 2
Hash.new со значениями по умолчаниюИтерация по хешамВложенные хешиСлияние и преобразованиеИтоги — счетчик частоты10Проект — Учёт студентов
Обзор проектаДобавить студента2Диапазоны
Что такое диапазон?Методы диапазоновДиапазоны в Case / WhenПовторение — практика по диапазонам5Мощь Enumerable
Select и RejectЦепочки MapReduce / Injectcount, all?, any?, none?group_by и partitionsort_by, min_by, max_byИтоги — Data Pipeline8Продвинутые условные конструкции
Case с классами и RegexМножественные значения в whenТернарный операторОднострочные if / unlessПовторение: Классификатор оценок