Hash.new со значениями по умолчанию
Часть раздела Логика и управление потоком путешествия по Ruby на Coddy. Урок 33 из 56.
По умолчанию поиск отсутствующего ключа в хеше возвращает nil:
scores = {}
puts scores["Alice"] # nilHash.new(default) это меняет. Каждый отсутствующий ключ возвращает переданное вами значение:
scores = Hash.new(0)
puts scores["Alice"] # 0Это самый чистый способ написать счётчик. Перед увеличением значения не нужно проверять if scores[name].nil?:
counts = Hash.new(0)
["a", "b", "a", "c", "a"].each do |letter|
counts[letter] += 1
end
puts counts.inspect # {"a"=>3, "b"=>1, "c"=>1}Важно: Hash.new(0) устанавливает значение по умолчанию равным 0, но не сохраняет ключ, когда вы его читаете. Хеш остаётся пустым, пока вы не выполните присваивание. Поэтому после того, как вы напишете counts[letter] += 1, ключ добавляется с новым значением.
Задание
ЛегкоПрочитайте список записей category:amount, разделённых запятыми (например, food:12,gas:30,food:8,books:25,gas:15). Создайте хеш с итогами по категориям с помощью Hash.new(0), затем выведите только те категории, итог для которых не меньше 20, по одной в строке, отсортированные по итогу в порядке убывания:
<category>: <total>Для приведённого выше примера входных данных вывод будет таким:
gas: 45
books: 25
food: 20Если ни одна категория не достигает 20, ничего не выводите.
Попробуйте сами
entries = gets.chomp.split(",")
# TODO: totals = Hash.new(0); накапливать сумму по категориям;
# затем вывести категории с total >= 20, отсортированные по total по убыванию
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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