Iteración sobre arreglos 2D
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 12 de 56.
Para visitar cada celda en un arreglo bidimensional, se anidan dos iteraciones. El bucle externo recorre las filas; el bucle interno recorre las columnas de esa fila.
El patrón de Ruby más idiomático utiliza each dos veces:
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 (cada uno en su propia línea)Si también necesitas los índices de fila y columna, por ejemplo para etiquetar cada celda, utiliza each_with_index en ambos niveles:
grid.each_with_index do |row, r|
row.each_with_index do |cell, c|
puts "(#{r},#{c}) = #{cell}"
end
endEste estilo es más corto y seguro que rastrear los índices a mano, no hay riesgo de sobrepasar el final de una fila.
Desafío
FácilSe proporciona el array bidimensional grid (3 filas × 3 columnas de enteros).
Para cada fila, encuentra cada celda cuyo valor sea estrictamente mayor que el promedio de esa fila. Imprime cada una de esas celdas en su propia línea con el formato:
(r,c) = valueUtiliza each_with_index anidados. Calcula el promedio dentro del bucle externo para que el umbral de cada fila sea independiente.
Para la cuadrícula por defecto, las celdas que superan el promedio de su fila son:
(0,1) = 8
(1,2) = 9
(2,0) = 6
(2,1) = 7Hoja de referencia
Para iterar sobre cada celda en un arreglo bidimensional, anida dos llamadas a each:
grid.each do |row|
row.each do |cell|
puts cell
end
endPara acceder también a los índices de fila y columna, utiliza each_with_index en ambos niveles:
grid.each_with_index do |row, r|
row.each_with_index do |cell, c|
puts "(#{r},#{c}) = #{cell}"
end
endPruébalo tú mismo
grid = [
[1, 8, 3],
[4, 5, 9],
[6, 7, 2]
]
# TODO: each_with_index anidado, imprimir celdas > el promedio de la fila
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline3Arreglos 2D
Conceptos básicos de arreglos 2DAcceso a elementos 2DIteración sobre arreglos 2DPatrones comunes en 2DResumen - Operaciones con matrices6Proyecto - Gestor de biblioteca
Descripción general del proyectoAñadir libro