Menu
Coddy logo textTech

Итерация по двумерным массивам

Часть раздела Логика и управление потоком путешествия по 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

Этот стиль короче и безопаснее, чем отслеживание индексов вручную, и нет риска выйти за пределы строки.

challenge icon

Задание

Легко

Дан двумерный массив 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, вывести ячейки > среднего значения строки
quiz iconПроверьте себя

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

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