Перебор хэшей
Часть раздела Логика и управление потоком путешествия по 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}Задание
СреднеТы применяешь распродажу к списку цен. Дан hash prices (символ item => целое значение price).
Прочитай одну строку ввода: список items, для которых нужно применить скидку 50%, разделённый запятыми (совпадает с символами в hash по имени).
Выведи в следующем порядке:
- По одной строке для каждого item в формате
<item>: $<final_price>, где final price — это значение со скидкой, если item находится в списке discount, или исходное значение в противном случае. Выполняй перебор с помощьюeach. Исходный порядок items сохраняется. Для расчёта скидки используй целочисленное деление (price / 2). Was: $<n>: исходная сумма (используйvalues.sum)Now: $<n>: сумма после применения скидки- Имена items, у которых final price всё ещё больше
2, объединённые с помощью,(используйselect+keysдля нового hash)
Для ввода bread,milk с hash по умолчанию результатом будет:
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Строки: подробный разбор
Обзор методов строкИнтерполяция строкПеребор строкРазделение и объединениеПовторение — String Weaver4Блоки, Proc и Lambda
Что такое блок?do..end и фигурные скобкиКлючевое слово yieldПараметры блокаProc и LambdaПовторение — пользовательский итератор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Повторение — конвейер данных3Двумерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваПеребор двумерных массивовРаспространённые шаблоны для двумерных массивовПовторение — операции с матрицами6Проект — Менеджер библиотеки
Обзор проектаДобавление книгиПотренируйтесь самостоятельно: Онлайн-компилятор Ruby