Ruby: Методы массивов
Помимо обычных методов, массивы содержат большое число методов, работающих с блоками. Возьмем для примера метод sort(). Он умеет сортировать только на основе сравнения значений. Такая сортировка сработает в случае простых массивов из чисел, но окажется бесполезной в большинстве реальных ситуаций, где процесс сортировки может быть хитрым. Пример:
# Население стран
data = [
['france', 140_000],
['usa', 300_000],
['germany', 40_000]
]Как отсортировать страны по количеству жителей в них? Для таких ситуаций и нужны функции высшего порядка:
# Внутрь передается блок,
# который принимает на вход элемент массива
data.sort_by { |row| row[1] }
# [
# ['germany', 40_000],
# ['france', 140_000],
# ['usa', 300_000]
# ]
# Либо, если кода много
data.sort_by do |row|
row[1]
endМетод sort_by() ожидает, что из блока вернётся значение, по которому нужно выполнить сортировку. Затем, когда значения собраны, этот метод выполняет сортировку, сравнивая значения с помощью оператора <=>.
Вот некоторые примеры подобных функций:
- max_by() – поиск максимального по указанному параметру в массиве
- partition() – разделяет массив на два по указанному условию
Таких функций у массивов десятки. Единственный способ их запомнить – постоянно практиковаться и читать документацию.
Задание
Некая организация занимается аналитикой распространения COVID-19. Одна из её задач – считать ежедневное количество заболевших. Из исходных данных у неё есть ежедневное количество заболевших по странам:
data = [
['11-9-2020', 'france', 10_000],
['11-10-2020', 'usa', 35_000],
['13-12-2020', 'india', 55_000],
['12-11-2020', 'france', 13_000],
['12-12-2020', 'usa', 22_000],
['11-12-2020', 'india', 54_000],
]Ваша задача — помочь им написать функцию sort_cases(), которая сортирует записи по дате в обратном порядке и возвращает наружу получившийся массив:
result = sort_cases(data)
# result= [
# ['13-12-2020', 'india', 55_000],
# ['12-12-2020', 'usa', 22_000],
# ['11-12-2020', 'india', 54_000],
# ['12-11-2020', 'france', 13_000],
# ['11-10-2020', 'usa', 35_000],
# ['11-9-2020', 'france', 10_000]
# ]Подсказки
Ruby: Методы массивов
Помимо обычных методов, массивы содержат большое число методов, работающих с блоками. Возьмем для примера метод sort(). Он умеет сортировать только на основе сравнения значений. Такая сортировка сработает в случае простых массивов из чисел, но окажется бесполезной в большинстве реальных ситуаций, где процесс сортировки может быть хитрым. Пример:
# Население стран
data = [
['france', 140_000],
['usa', 300_000],
['germany', 40_000]
]Как отсортировать страны по количеству жителей в них? Для таких ситуаций и нужны функции высшего порядка:
# Внутрь передается блок,
# который принимает на вход элемент массива
data.sort_by { |row| row[1] }
# [
# ['germany', 40_000],
# ['france', 140_000],
# ['usa', 300_000]
# ]
# Либо, если кода много
data.sort_by do |row|
row[1]
endМетод sort_by() ожидает, что из блока вернётся значение, по которому нужно выполнить сортировку. Затем, когда значения собраны, этот метод выполняет сортировку, сравнивая значения с помощью оператора <=>.
Вот некоторые примеры подобных функций:
- max_by() – поиск максимального по указанному параметру в массиве
- partition() – разделяет массив на два по указанному условию
Таких функций у массивов десятки. Единственный способ их запомнить – постоянно практиковаться и читать документацию.
Задание
Некая организация занимается аналитикой распространения COVID-19. Одна из её задач – считать ежедневное количество заболевших. Из исходных данных у неё есть ежедневное количество заболевших по странам:
data = [
['11-9-2020', 'france', 10_000],
['11-10-2020', 'usa', 35_000],
['13-12-2020', 'india', 55_000],
['12-11-2020', 'france', 13_000],
['12-12-2020', 'usa', 22_000],
['11-12-2020', 'india', 54_000],
]Ваша задача — помочь им написать функцию sort_cases(), которая сортирует записи по дате в обратном порядке и возвращает наружу получившийся массив:
result = sort_cases(data)
# result= [
# ['13-12-2020', 'india', 55_000],
# ['12-12-2020', 'usa', 22_000],
# ['11-12-2020', 'india', 54_000],
# ['12-11-2020', 'france', 13_000],
# ['11-10-2020', 'usa', 35_000],
# ['11-9-2020', 'france', 10_000]
# ]Подсказки
Ваше упражнение проверяется по этим тестам
# frozen_string_literal: true
require 'test_helper'
require_relative 'index'
describe 'function' do
data1 = [
['11-9-2020', 'france', 10_000],
['11-10-2020', 'usa', 35_000],
['13-12-2020', 'india', 55_000],
['12-11-2020', 'france', 13_000],
['12-12-2020', 'usa', 22_000],
['11-12-2020', 'india', 54_000]
]
it 'should works' do
expected1 = [
['13-12-2020', 'india', 55_000],
['12-12-2020', 'usa', 22_000],
['11-12-2020', 'india', 54_000],
['12-11-2020', 'france', 13_000],
['11-10-2020', 'usa', 35_000],
['11-9-2020', 'france', 10_000]
]
actual1 = sort_cases(data1)
assert { actual1 == expected1 }
end
endРешение учителя откроется через:
20:00
