sort_by, min_by, max_by
Часть раздела Логика и потоки выполнения путешествия по Ruby на Coddy. Урок 26 из 56.
Вы уже знаете sort, min и max. Версии _by дают вам контроль над тем, что сравнивать, что идеально подходит для сортировки структурированных данных.
sort_by принимает блок; блок возвращает значение для сравнения каждого элемента:
words = ["banana", "hi", "hello"]
by_length = words.sort_by { |w| w.length }
puts by_length.inspect # ["hi", "hello", "banana"]Для сортировки по убыванию используйте отрицание для ключа сравнения, -w.length для чисел, или вызовите reverse для результата.
min_by и max_by возвращают один элемент с наименьшим / наибольшим значением блока:
people = [
{ name: "Ada", age: 36 },
{ name: "Bob", age: 22 },
{ name: "Cara", age: 41 }
]
youngest = people.min_by { |p| p[:age] }
oldest = people.max_by { |p| p[:age] }
puts youngest[:name] # Bob
puts oldest[:name] # CaraСокращенная запись также работает: words.sort_by(&:length).
Задание
СреднеДан массив products, каждый элемент которого представляет собой хеш с ключами :name, :price и :quantity. Стоимость запасов каждого продукта вычисляется как price * quantity.
Выведите три строки:
- Имена, отсортированные по стоимости запасов в порядке убывания, разделенные через
,(используйтеsort_byдля вычисленного значения) - Имя продукта с наибольшим количеством среди товаров по цене ниже 5 (используйте
max_byдля отфильтрованного списка) - Имя самого дешевого продукта, количество которого не менее 10 (используйте
min_byдля отфильтрованного списка)
Для массива по умолчанию вывод будет следующим:
cheese, milk, bread, apple
bread
breadПопробуйте сами
products = [
{ name: "milk", price: 3, quantity: 8 },
{ name: "apple", price: 1, quantity: 4 },
{ name: "cheese", price: 5, quantity: 6 },
{ name: "bread", price: 2, quantity: 12 }
]
# TODO: отсортировать по стоимости запасов (убывание); найти макс. по количеству (цена < 5); найти мин. по цене (количество >= 10)
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и потоки выполнения
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