Ruby: Методы массивов
Помимо обычных методов, массивы содержат большое число методов работающих с блоками. Возьмем для примера метод sort()
. Он умеет сортировать только на основе сравнения значений. Такая сортировка сработает в случае простых массивов из чисел, но окажется бесполезной в большинстве реальных ситуаций, где процесс сортировки может быть хитрым. Пример:
# Население стран
data = [
['russia', 140_000],
['usa', 300_000],
['ukraine', 40_000]
]
Как отсортировать страны по количеству жителей в них? Для таких ситуаций и нужны функции высшего порядка:
# Внутрь передается блок, который принимает на вход элемент массива
data.sort_by { |row| row[1] }
# [
# ['ukraine', 40_000],
# ['russia', 140_000],
# ['usa', 300_000]
# ]
# Либо, если кода много
data.sort_by do |row|
row[1]
end
Метод sort_by()
ожидает, что из блока вернется значение по которому нужно выполнить сортировку. Затем, когда значения собраны, этот метод выполняет сортировку сравнивая значения с помощью оператора <=>
.
Вот некоторые примеры подобных функций:
- max_by() – поиск максимального по указанному параметру в массиве
- partition() – разделяет массив на два по указанному условию
Всего же, этих функций у массивов десятки. Единственный способ их запомнить – постоянно практиковаться и читать документацию.
Задание
Некая организация занимается аналитикой распространения COVID-19. Одна из ее задач – считать еждневное количество заболевших. Из исходных данных у нее есть ежедневное количество заболевших по странам:
data = [
['11-9-2020', 'russia', 10_000],
['11-10-2020', 'usa', 35_000],
['13-12-2020', 'india', 55_000],
['12-11-2020', 'russia', 13_000],
['12-12-2020', 'usa', 22_000],
['11-12-2020', 'india', 54_000],
]
Ваша задача, помочь им написать функцию, которая сортирует записи по дате в обратном порядке и возвращает наружу получившийся массив
result = sort_cases(data)
# expected1 = [
# ['13-12-2020', 'india', 55_000],
# ['12-12-2020', 'usa', 22_000],
# ['11-12-2020', 'india', 54_000],
# ['12-11-2020', 'russia', 13_000],
# ['11-10-2020', 'usa', 35_000],
# ['11-9-2020', 'russia', 10_000]
# ]
Подсказки
- Ключом сортировки в данном случае выступает unix timestamp, который можно получить из даты, преобразовав его к объекту типа Time и затем, с помощью
to_i()
в unix timestamp. - reverse() – сортировка массива в обратном порядке
Пожалуйста, авторизуйтесь, это необходимо для отслеживания прогресса выполнения уроков. Если у вас ещё нет учётной записи, то сейчас самое время создать аккаунт.