18 - Arreglos: componentes de tipo arreglo

Hasta ahora hemos visto que un Array nos permite almacenar enteros, valores flotantes y cadenas de caracteres.

La flexibilidad de un Array y la posibilidad de crear estructuras más complejas se da cuando insertamos en un Array elementos de tipo Array.

Un ejemplo de como podemos crear Array con componentes de tipo Array:

productos = [["peras",25], ["manzanas",32], ["naranjas",15], ["mandarinas",21]]
print productos, "\n"        # [["peras", 25], ["manzanas", 32], ["naranjas", 15], ["mandarinas", 21]]
print productos[0], "\n"     # ["peras", 25]
print productos[0][0], "\n"  # peras
print productos[0][1], "\n"  # 25

En el ejemplo creamos por asignación un Array de tres componentes, cada componente es un Array de dos componentes donde se almacena el nombre de un producto y su precio.

Imprimimos todo el Array:

print productos, "\n"        # [["peras", 25], ["manzanas", 32], ["naranjas", 15], ["mandarinas", 21]]

Imprimimos la primer componente del Array productos:

print productos[0], "\n"     # ["peras", 25]

Imprimimos la primer componente del Array contenido en la primer componente del Array productos:

print productos[0][0], "\n"  # peras

Imprimimos la segunda componente del Array contenido en la primer componente del Array productos:

print productos[0][1], "\n"  # 25

Problema 1:

Crear un Array por asignación. El Array tiene que tener cuatro elementos. Cada elemento debe ser un Array de 3 enteros.
Imprimir sus elementos accediendo de diferentes modos.

Programa: ejercicio082.rb

arreglo = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]

puts "imprimimos el arreglo completo"
print arreglo, "\n"
puts "imprimimos la primer componente"
print arreglo[0], "\n"
puts "imprimimos la primer componente del Array contenido en la primer componente del Array arreglo"
print arreglo[0][0], "\n"
puts "imprimimos el arreglo completo recorriendo sus elementos con el método each"
arreglo.each {|elemento| print elemento, "\n"}
puts "imprimimos los elementos de la primer componente del Array arreglo recorriendo el mismo con un each"
arreglo[0].each {|elemento| print elemento, "\n"}
puts "imprimimos cada elementos mediante dos each anidados"
arreglo.each do |elemento|
   elemento.each do |elemento| 
     print elemento, "-"
   end
end
Array de Arrray en Ruby

Podemos ver que para acceder a un elemento particular de un Array interno del Array principal debemos indicar dos subíndices:

print arreglo[0][0], "\n"

Cuando recorremos el Array arreglo mediante el método each lo que se obtiene en cada ciclo es un Array y lo podemos también recorrer mediante un each:

arreglo.each do |elemento|
   elemento.each do |elemento| 
     print elemento, "-"
   end
end

Problema 2:

Crear un Array por asignación. El Array tiene que tener 2 elementos. Cada elemento debe ser de tipo Array de 5 enteros.
Calcular y mostrar la suma de cada Array contenida en el Array principal.

Programa: ejercicio083.rb

arreglo = [[1,1,1,1,1], [2,2,2,2,2]]
arreglo.each do |elemento|
  suma = 0
  elemento.each {|elemento| suma = suma + elemento}
  puts suma
end

Mediante dos each anidados sumamos todos los elementos de cada uno de los Array internos de la variable arreglo.

Problema 3:

Crear un Array por asignación. El Array tiene que tener 5 elementos. Cada elemento debe ser un Array, el primera Array tiene que tener un elemento, el segunda dos elementos, el tercero tres elementos y así sucesivamente.
Sumar todos los valores y mostrar dicho valor.

Programa: ejercicio084.rb

arreglo = [[1], [1,2], [1,2,3], [1,2,3,4], [1,2,3,4,5]]
suma = 0
arreglo.each do |elemento|
  elemento.each {|elemento| suma = suma + elemento}
end
puts suma

Lo primero que es importante notar que los Array contenidos en el Array arreglo no tienen porque ser del mismo tamaño.

La forma más sencilla es utilizar dos each anidados. El primero se repite tantas veces como elementos tenga el Array principal:

arreglo.each do |elemento|

El segundo each nos sirve para recorrer y acceder a cada elemento entero de cada Array interno:

  elemento.each {|elemento| suma = suma + elemento}

La cantidad de veces que se repite el each interno depende de la cantidad de elementos que tiene el Array que estamos sumando en ese momento.