22 - Hash: eliminación de elementos

Como hemos dicho un Hash es una estructura de datos que podemos agregar elementos, modificarlos y también borrarlos.

Tenemos al igual que la clase Array un método llamado clear que borra todas componentes del Hash.

Veamos el método delete que le pasamos como parámetro la clave de una componente y si la encuentra la elimina del Hash (se borra la clave y su valor)

Problema 1:

Crear y cargar por asignación un Hash donde se almacene como clave el nombre de producto y como valor el precio del mismo.
Ingresar por teclado el nombre de un producto y si existe proceder a eliminarlo.

Programa: ejercicio093.rb

productos = {"manzanas" => 25,
             "peras" => 32,
             "naranjas" => 15,
             "kiwis" => 56}

puts productos
print "Ingrese un nombre de articulo para eliminarlo:"
prod = gets.chomp
if productos.delete(prod)==nil
  puts "No existe un producto con el nombre ingresado"
else
  puts "Se eliminó el producto"
end
puts productos

Al método delete de la clase Hash le pasamos el nombre del producto a eliminar. Si no existe retorna un nil en caso contrario retorna el elemento eliminado:

print "Ingrese un nombre de articulo para eliminarlo:"
prod = gets.chomp
if productos.delete(prod)==nil
  puts "No existe un producto con el nombre ingresado"
else
  puts "Se eliminó el producto"
end

Si queremos borrar varios elementos de un Hash disponemos del método delete_if que mediante un bloque indicamos la condición que debe cumplir la componente para ser eliminado.

Problema 2:

Crear y cargar por asignación un Hash donde se almacene como clave el nombre de producto y como valor el precio del mismo.
Eliminar todos los elementos con un precio mayor a 30.

Programa: ejercicio094.rb

productos = {"manzanas" => 25,
             "peras" => 32,
             "naranjas" => 15,
             "kiwis" => 56}

puts productos
productos.delete_if {|clave, valor| valor > 30}
puts "Luego de eliminar todos los productos con un precio mayor a 30"
puts productos

El método delete_if borra todos los elementos del Hash que cumplen la condición que el valor sea mayor a 30:

productos.delete_if {|clave, valor| valor > 30}

Si queremos eliminar una serie de componentes sin modificar el Hash originario sino generando uno nuevo podemos utilizar el método reject:

Programa: ejercicio095.rb

productos = {"manzanas" => 25,
             "peras" => 32,
             "naranjas" => 15,
             "kiwis" => 56}

puts productos
prod_nuevos = productos.reject {|clave, valor| valor > 30}
puts "Luego de eliminar todos los productos con un precio mayor a 30"
puts prod_nuevos
puts "El Hash original no se modifica"
puts productos

El Hash productos nunca se modifica (no se borran elementos), lo que sucede es que el método reject retorna un Hash con los elementos contenidos en productos salvo lo que se borran por la condición impuesta:

prod_nuevos = productos.reject {|clave, valor| valor > 30}