Menu
CoddyTech

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).

challenge icon

Задание

Средне

Дан массив products, каждый элемент которого представляет собой хеш с ключами :name, :price и :quantity. Стоимость запасов каждого продукта вычисляется как price * quantity.

Выведите три строки:

  1. Имена, отсортированные по стоимости запасов в порядке убывания, разделенные через , (используйте sort_by для вычисленного значения)
  2. Имя продукта с наибольшим количеством среди товаров по цене ниже 5 (используйте max_by для отфильтрованного списка)
  3. Имя самого дешевого продукта, количество которого не менее 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)
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор Ruby