En Ruby tanto con Array como con estructuras de tipo Hash se utilizan métodos y el concepto de bloques para recorrer.
El método más común para iterar un Hash en Ruby se llama each y tiene dos sintaxis para implementarlo.
Veamos las sintaxis para recorrer un Hash:
paises = {"argentina" => 40000000,
"españa" => 46000000,
"brasil" => 190000000,
"uruguay" => 3400000}
paises.each do |clave, valor|
puts "#{clave} #{valor}"
end
Estamos llamando al método each y le pasamos un bloque encerrado entre las palabras claves do y end.
El bloque tiene acceso en cada iteración o repetición a la clave y el valor del Hash indicada entre los símbolos |variable1, variable2|
Si ejecutamos este programa vemos que aparecen todas las claves y sus valores asociados:
argentina 40000000 españa 46000000 brasil 190000000 uruguay 3400000
Cuando el algoritmo del bloque es muy reducido es común utilizar los símbolos {} en remplazo de las palabras claves do y end.
paises = {"argentina" => 40000000,
"españa" => 46000000,
"brasil" => 190000000,
"uruguay" => 3400000}
paises.each {|clave, valor| puts "#{clave} #{valor}"}
Normalmente los bloques de llaves se utilizan en una sola línea.
Definir un Hash que almacene los nombres de paises como clave y como valor la cantidad de habitantes. Sumar la cantidad de habitantes de todos los paises.
paises = {"argentina" => 40000000,
"españa" => 46000000,
"brasil" => 190000000,
"uruguay" => 3400000}
suma = 0
paises.each {|clave, valor| suma = suma + valor}
puts "La cantidad total de habitantes de todos los paises es #{suma}"
Previo a llamar al método each inicializamos el acumulador suma con cero. Luego dentro del bloque que le pasamos a each acumulamos todos los habitantes de cada país:
suma = 0
paises.each {|clave, valor| suma = suma + valor}
puts "La cantidad total de habitantes de todos los paises es #{suma}"
Es bueno siempre tener a mano la página oficial de la clase Hash de Ruby
Si buscamos entre la gran cantidad de métodos de la clase Hash podemos encontrar uno que se llama each_value que es similar a each salvo que no tenemos acceso a la clave. En este problema como solo debemos sumar todos los valores que se almacenan en el Hash es más conveniente el método each_value:
paises.each_value {|valor| suma = suma + valor}
Desarrollar una aplicación que nos permita crear un diccionario ingles/castellano (utilizar un Hash). La clave es la palabra en ingles y el valor es la palabra en castellano.
Mostrar por pantalla cada palabra y su traducción separada por el caracter =
diccionario = {"red" => "rojo",
"blue" => "azul",
"yellow" => "amarillo",
"green" => "verde"}
diccionario.each{|clave, valor| puts "#{clave}=#{valor}"}
En este problema es obligatorio utilizar el each ya que debemos acceder tanto a la clave como el valor del Hash:
diccionario.each{|clave, valor| puts "#{clave}=#{valor}"}
ejercicio091.rb
productos = {"manzanas" => 25,
"peras" => 32,
"naranjas" => 15,
"kiwis" => 56}
cantidad = 0
productos.each do |clave,valor|
if valor > 20
cantidad = cantidad + 1
puts clave
end
end
puts "La cantidad de productos con un precio mayor a 20 son #{cantidad}"
ejercicio092.rb
empleados = {}
loop do
print "Ingrese el nombre del empleado:"
nom = gets.chomp
print "Ingrese el sueldo:"
sueldo = gets.to_f
empleados[nom] = sueldo
print "¿Desea ingresar otro empleado [s/n]?"
opcion = gets.chomp
if opcion == "n"
break
end
end
altos = 0
bajos = 0
empleados.each_value do |valor|
if valor >= 1000
altos = altos + 1
else
bajos = bajos + 1
end
end
puts "La cantidad de empleados con sueldos mayores o igual a 1000 son #{altos}"
puts "La cantidad de empleados con sueldos menores a 1000 son #{bajos}"