19 - Estructura de datos tipo Hash

Hasta ahora hemos presentado la estructuras de datos tipo Array. Ahora presentaremos y comenzaremos a utilizar la estructura de datos tipo Hash.

La estructura de datos tipo Hash utiliza una clave para acceder a un valor. El subíndice puede ser un entero, un string etc.

Podemos relacionar la estructura de tipo Hash con conceptos que conocemos:

  • Un diccionario tradicional podemos utilizar un Hash para representarlo. La clave sería la palabra y el valor sería la definición de dicha palabra.
  • Una agenda personal también la podemos representar como un Hash. La fecha sería la clave y las actividades de dicha fecha sería el valor.
  • Un conjunto de usuarios de un sitio web podemos almacenarlo en un Hash. El nombre de usuario sería la clave y como valor podríamos almacenar su mail, clave, fechas de login etc.

Hay muchos problemas de la realidad que se pueden representar mediante un Hash.

En forma similar a un Array un Hash es una estructura de datos mutable es decir podemos agregar elementos, modificar y borrar.

Problema 1:

Definir un Hash que almacene los nombres de paises como clave y como valor la cantidad de habitantes. Imprimir luego el Hash completo y la cantidad de habitantes de un país en particular.

Programa: ejercicio085.rb

paises = {"argentina" => 40000000,
          "españa" => 46000000,
          "brasil" => 190000000,
          "uruguay" => 3400000}

puts paises
puts "La cantidad de habitantes de españa es: #{paises["españa"]}"

La primer forma que veremos para crear un Hash e inmediatamente inicializar cuatro componentes se hace con la sintaxis:

paises = {"argentina" => 40000000,
          "españa" => 46000000,
          "brasil" => 190000000,
          "uruguay" => 3400000}

Indicamos primero la clave:

"argentina"

Luego el operador:

=>

Finalmente indicamos el valor para dicha clave:

40000000

Utilizamos las llaves en lugar de los corchetes que se utilizan en los Array.

Para imprimir todo el Hash:

puts paises

Para acceder a un valor del Hash debemos indicar entre corchetes la clave que queremos acceder:

puts "La cantidad de habitantes de españa es: #{paises["españa"]}"

Si la clave no existe en el Hash se retorna un nil.

Otras sintaxis para la definición de un Hash.

  • paises = {}
    
    paises["argentina"] = 40000000
    paises["españa"] = 46000000
    paises["brasil"] = 190000000
    paises["uruguay"] = 3400000
    
    puts paises          
    puts "La cantidad de habitantes de españa es: #{paises["españa"]}"
    

    De esta forma primero creamos un Hash vacío y luego cargamos 4 elementos por asignación uno a uno.

  • paises = Hash.new
    
    paises["argentina"] = 40000000
    paises["españa"] = 46000000
    paises["brasil"] = 190000000
    paises["uruguay"] = 3400000
    
    puts paises          
    puts "La cantidad de habitantes de españa es: #{paises["españa"]}"
    

    En esta forma se crea el Hash llamando al método new de la clase Hash.

  • paises = {:argentina => 40000000,
              :españa => 46000000,
              :brasil => 190000000,
              :uruguay => 3400000}
    
    puts paises          
    puts "La cantidad de habitantes de españa es: #{paises[:españa]}"
    

    Cuando se puede en lugar de definir un string como clave se define un símbolo (en Ruby para definir un símbolo se le antecede el caracter :)

    El uso de símbolos en lugar de string hace más eficiente el programa.

  • paises = {argentina: 40000000,
              españa: 46000000,
              brasil: 190000000,
              uruguay: 3400000}
    
    puts paises          
    puts "La cantidad de habitantes de españa es: #{paises[:españa]}"
    

    Una variante cuando utilizamos símbolos como clave en un Hash es disponer el caracter : luego del nombre del símbolo y sacar el operador =>

Problema propuesto

  • 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.
    1) Utilizar distintas formas para la creación del Hash.
    2) Mostrar la traducción de dos palabras que existan en el diccionario.
Solución
ejercicio086.rb

diccionario1 = {"red" => "rojo",
                "blue" => "azul",
                "yellow" => "amarillo",
                "green" => "verde"}

puts "La traducción de blue es #{diccionario1["blue"]}"
puts "La traducción de green es #{diccionario1["green"]}"

# otras sintaxis para definir un Hash

diccionario2 = {}
diccionario2["red"] = "rojo"
diccionario2["blue"] = "azul"
diccionario2["yellow"] = "amarillo"
diccionario2["green"] = "verde"

puts "La traducción de blue es #{diccionario2["blue"]}"
puts "La traducción de green es #{diccionario2["green"]}"

diccionario3 = Hash.new
diccionario3["red"] = "rojo"
diccionario3["blue"] = "azul"
diccionario3["yellow"] = "amarillo"
diccionario3["green"] = "verde"

puts "La traducción de blue es #{diccionario3["blue"]}"
puts "La traducción de green es #{diccionario3["green"]}"

diccionario4 = {:red => "rojo",
                :blue => "azul",
                :yellow => "amarillo",
                :green => "verde"}

puts "La traducción de blue es #{diccionario4[:blue]}"
puts "La traducción de green es #{diccionario4[:green]}"

diccionario5 = {red: "rojo",
                blue: "azul",
                yellow: "amarillo",
                green: "verde"}

puts "La traducción de blue es #{diccionario5[:blue]}"
puts "La traducción de green es #{diccionario5[:green]}"