Итерация по двумерным массивам
Часть раздела Логика и управление потоком путешествия по Ruby на Coddy — урок 12 из 56.
Чтобы обойти каждую ячейку в двумерном массиве, вы используете два вложенных цикла. Внешний цикл проходит по строкам, а внутренний — по столбцам этой строки.
Наиболее идиоматичный паттерн в Ruby использует each дважды:
grid = [
[1, 2, 3],
[4, 5, 6]
]
grid.each do |row|
row.each do |cell|
puts cell
end
end
# 1, 2, 3, 4, 5, 6 (каждое на отдельной строке)Если вам также нужны индексы строк и столбцов, например, чтобы пометить каждую ячейку, используйте each_with_index на обоих уровнях:
grid.each_with_index do |row, r|
row.each_with_index do |cell, c|
puts "(#{r},#{c}) = #{cell}"
end
endЭтот стиль короче и безопаснее, чем отслеживание индексов вручную, и нет риска выйти за пределы строки.
Задание
ЛегкоДан двумерный массив grid (3 строки × 3 столбца целых чисел).
Для каждой строки найдите каждую ячейку, значение которой строго больше среднего значения этой строки. Выведите каждую такую ячейку на отдельной строке в формате:
(r,c) = valueИспользуйте вложенные each_with_index. Вычисляйте среднее значение внутри внешнего цикла, чтобы порог для каждой строки был независимым.
Для сетки по умолчанию ячейки, значения которых превышают среднее значение по строке:
(0,1) = 8
(1,2) = 9
(2,0) = 6
(2,1) = 7Шпаргалка
Чтобы перебрать каждую ячейку в двумерном массиве, вложите два вызова each:
grid.each do |row|
row.each do |cell|
puts cell
end
endЧтобы также получить доступ к индексам строк и столбцов, используйте each_with_index на обоих уровнях:
grid.each_with_index do |row, r|
row.each_with_index do |cell, c|
puts "(#{r},#{c}) = #{cell}"
end
endПопробуйте сами
grid = [
[1, 8, 3],
[4, 5, 9],
[6, 7, 2]
]
# TODO: вложенный each_with_index, вывести ячейки > среднего значения строки
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Обзор методов строкИнтерполяция строкИтерация по строкамSplit и JoinИтоги — String Weaver4Блоки, Proc и лямбды
Что такое блок?do..end против фигурных скобокКлючевое слово yieldПараметры блокаProc и лямбдыИтоги: пользовательский итератор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Итоги — Data Pipeline8Продвинутые условные конструкции
Case с классами и RegexМножественные значения в whenТернарный операторОднострочные if / unlessПовторение: Классификатор оценок3Двумерные массивы
Основы двумерных массивовДоступ к элементам двумерного массиваИтерация по двумерным массивамРаспространенные 2D-паттерныИтоги: Операции с матрицами6Проект — Менеджер библиотеки
Обзор проектаДобавление книги