Фильтрация по жанру
Часть раздела Логика и потоки выполнения путешествия по Ruby на Coddy. Урок 31 из 56.
Добавьте опцию 3. Filter By Genre. Пользователь вводит жанр, и программа выводит список всех книг в этом конкретном жанре, на этот раз с учетом регистра.
Вы также сообщите количество, используя count из предыдущей главы.
Задание
ЛегкоРасширьте цикл меню. Когда выбран вариант "3":
printприглашениеGenre:и прочитайте егоselectкниги, чей:genreв точности совпадает с введенным значением- Выведите по одной строке для каждого совпадения:
<title> by <author> - После списка выведите
Total: <n>, гдеn— это количество совпадений (используйтеcountилиmatches.length)
Оставьте все предыдущие ветки без изменений.
Для входных данных, добавляющих две книги жанра Fantasy и одну книгу Sci-Fi, затем фильтрующих по Fantasy и выходящих из программы, блок фильтрации должен вывести обе книги фэнтези и Total: 2.
Попробуйте сами
library = []
loop do
puts "--- Library Manager ---"
puts "1. Add Book"
puts "2. Search By Title"
puts "3. Filter By Genre"
puts "4. Mark As Read"
puts "5. Exit"
print "Choose an option: "
choice = gets.chomp
if choice == "5"
puts "Goodbye!"
break
elsif choice == "1"
print "Title: "
title = gets.chomp
print "Author: "
author = gets.chomp
print "Genre: "
genre = gets.chomp
library.push({ title: title, author: author, genre: genre, read: false })
puts "Book added!"
elsif choice == "2"
print "Search title: "
query = gets.chomp
matches = library.select { |b| b[:title].downcase.include?(query.downcase) }
if matches.empty?
puts "No matches."
else
matches.each { |b| puts "#{b[:title]} by #{b[:author]}" }
end
end
# TODO: обработать choice == "3", запросить жанр,
# выбрать подходящие книги, вывести каждую, затем "Total: <n>"
end
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
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