Итерация по хешам
Часть раздела Логика и управление потоком путешествия по 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 } # яблоко, хлеб, молокоeach_value перебирает только значения:
prices.each_value { |v| puts v } # 1, 3, 4И каждый метод модуля Enumerable, который вы видели в прошлой главе — map, select, reduce — также работает и с хэшами. Вы просто получаете пару ключ/значение (или двухэлементный массив) на каждой итерации:
prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}Задание
СреднеВы применяете скидку к прайс-листу. Хеш prices уже задан (символ товара => целочисленная цена).
Прочитайте одну строку ввода: список разделенных запятыми товаров со скидкой 50% (совпадающих с символами в хеше по имени).
Выведите в следующем порядке:
- По одной строке на каждый
itemв формате<item>: $<final_price>, где итоговая цена — это цена со скидкой, еслиitemесть в списке скидок, или исходная цена в противном случае. Используйте итерацию с помощьюeach. Элементы сохраняют свой исходный порядок. Используйте целочисленное деление для скидки (price / 2). Was: $<n>: исходная общая сумма (используйтеvalues.sum)Now: $<n>: общая сумма после скидки- Названия товаров, чья итоговая
priceвсе еще больше2, объединенные через,(используйтеselect+keysдля новогоhash)
Для ввода bread,milk со стандартным хешем вывод будет следующим:
apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheeseПопробуйте сами
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# TODO: построить хеш final-price через 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Повторение: Классификатор оценокПотренируйтесь самостоятельно: Онлайн-компилятор Ruby