Перебор двумерных массивов
Часть раздела Логика и управление потоком путешествия по 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Попробуйте сами
grid = [
[1, 8, 3],
[4, 5, 9],
[6, 7, 2]
]
# TODO: вложенный each_with_index, вывести ячейки > среднего значения строки
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
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