Eliminar elemento repetido de una lista en Ruby

Las listas en Ruby son objetos Array dinámicos que admiten valores de diferentes tipos y poseen diferentes métodos que nos permiten realizar una variada cantidad de operaciones, como se explica en Listas en Ruby.

Descripción del tema: dada una lista de números, algunos repetidos, se le pregunta al usuario cuál desea eliminar y el programa debe eliminar todos los elementos de la lista que sean igual al número ingresado por el usuario. El programa debe mostrar en pantalla primero la lista actual con los elementos que posee.

Código fuente
#!/usr/bin/env ruby

def removeItems(arrs, item)
  arrs.delete_if { |i| i == item }
  arrs
end

arrs = [2, 90, 89, 2, 5, 101, 90, 35, 2, 43, 89, 101, 5, 89, 90, 5]

puts "Lista actual: #{arrs}"

print "\nIngrese el elemento que desea eliminar: "
item = gets().chomp().to_i

puts "Lista modificada: #{removeItems(arrs, item)}"

La línea #!/usr/bin/env ruby ya la he usado en otras publicaciones, es muy famosa en todos los sistemas Tipo Unix y se llama Shebang, permite ejecutar programas que requieren de un intérprete, directamente sobre la línea de comandos sin necesidad de escribir el nombre del intérprete; por ejemplo, ./EliminarElemento.rb en lugar de ruby EliminarElemento.rb.

Función removeItems()
def removeItems(arrs, item)
  arrs.delete_if { |i| i == item }
  arrs
end

Una pequeña función que hace muy bien su labor, recibe 2 argumento, el primero es el array o lista que contiene los elementos y el segundo es el elemento que deseamos eliminar; por último, devuelve la lista modificada.

Método .delete_if, eliminando el elemento
arrs.delete_if { |i| i == item }

Este método elimina todos los elementos que sean iguales a la variable item. El método .delete_if es un iterador que recorre la lista y los valores los asigna a la variable i;  mientras que en el bloque se comparan los valores de la variable i con la variable item, si son iguales entonces se elimina dicho elemento.

Devolviendo el resultado

La línea 3 de la función removeItems() devuelve la lista modificada, en Ruby no es requerida la sentencia return como en otros lenguajes de programación; por ejemplo: Go, C++ y Python.

Creando la lista
arrs = [2, 90, 89, 2, 5, 101, 90, 35, 2, 43, 89, 101, 5, 89, 90, 5]

Creamos una lista con valores predefinidos y repetidos para este ejemplo, pero funciona igual para valores generados de otras formas como números aleatorios, ingresados por el usuario o quizar de un archivo de texto.

Mostrando lista actual
puts "Lista actual: #{arrs}"

El programa le muestra al usuario que valores tiene la lista actual antes de realizar cualquier operación sobre ella. La expresión #{arrs} se conoce como interpolación, reemplaza la expresión por el contenido de la lista en el string.

Solicitando y leyendo el elemento a eliminar
print "\nIngrese el elemento que desea eliminar: "
item = gets().chomp().to_i

Primero le solicitamos al usuario que indique cual es el elemento que desea eliminar y luego el programa lo lee usando el método gets(), con el método chomp() se elimina el carácter de salto de línea «\n» y por último convertimos el valor a entero con el metodo .to_i. El número se asigna a la variable item.

Mostrando el resultado
puts "Lista modificada: #{removeItems(arrs, item)}"

Por último se llama a la función removeItems() junto con sus argumentos y el resultado devuelto se muestra usando interpolación de strings, el cual reemplaza la expresión #{} por el contenido de la lista.

Ejecutando el programa

Al ejecutar el programa, nos muestra un resultado similar a este:

[fixedtorres@linuxero]$ ./EliminarElementoDeArray.rb
Lista actual: [2, 90, 89, 2, 5, 101, 90, 35, 2, 43, 89, 101, 5, 89, 90, 5]

Ingrese el elemento que desea eliminar: 89
Lista modificada: [2, 90, 2, 5, 101, 90, 35, 2, 43, 101, 5, 90, 5]
[fixedtorres@linuxero]$

Nos muestra la lista actual, solicita que ingresemos el elemento que deseamos eliminar y nos devuelve la lista sin el elemento que ingresamos, y si hay repetidos, los elimina. En este caso se elimina el 89 que se repite 3 veces.



Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *