Hoy veremos cómo ordenar o sortear los arreglos en Ruby. Vamos a trabajar con arreglos de cadenas (strings) y arreglos numéricos (enteros o flotantes); además de que vamos a ver cómo ordenar a los arreglos de manera ascendente y descendente.
Ruby provee un operador interesante que recientemente fue introducido en PHP, el cual es llamado operador nave espacial (quién sabe por qué, yo no le encuentro mucho parecido) y se representa así:
<=>
Por cierto, la foto del código fue tomada con Polacode y le puse la marca de agua con WaterPy.
La peculiaridad de este operador es que evalúa dos valores y regresa 1, 0 o -1 dependiendo de que si uno es mayor, igual o menor al otro. Ya veremos en los ejemplos, el punto es que con esto podemos ordenar y comparar con pocas líneas de código.
El operador nave espacial (así lo llamaremos a partir de ahora) puede ser usado para regresar directamente el valor, pero también se puede comparar a los valores manualmente y regresar 0, 1 o -1; no hay diferencia alguna más que en las líneas ahorradas; ambos permiten comparar para ordenar arreglos.
En resumen no importa si usas if, else y elif o el operador.
Internamente Ruby sabe cómo ordenar, nosotros únicamente debemos indicarle si un elemento va antes o después de otro; y esto es dándole un 1 si es mayor, 0 si es igual y -1 si es menor.
El operador nave espacial evalúa esto y nos ahorra comparar y regresar, veamos algunos ejemplos:
Lo mismo podría hacerse con un par de if
y else
, pero esto es más corto.
El punto es que hay que llamar a la función sort
y pasarle una manera de comparar los arreglos; veremos que esto es fácil.
Nota: por defecto, sort
ordena de manera ascendente.
Comencemos ordenando arreglos de números en Ruby. Como lo dije, se llama al método sort
. Si no se le pasa método de comparación, entonces lo ordena de manera ascendente.
Si queremos ordenarlo de manera descendente proporcionamos un método de comparación en donde regresamos 1, 0 o -1; o también se puede usar el operador nave espacial (cuyo ejemplo se ve en el siguiente apartado de arreglos de cadenas). Veamos el código:
=begin
Ordenar arreglos numéricos y de cadena con Ruby, sort y el operador <=>
@author parzibyte
=end
edades = [15, 20, 55, 1, 20, 20, 48, 20, 55, 9, 65, 2, 2, 35, 77, 2, 5, 6]
puts "Edades sin ordenar: #{edades}"
# Por defecto, sort ordena de manera ascendente
edades_ascendente = edades.sort
puts "Edades ordenadas de manera ascendente: #{edades_ascendente}"
# [1, 2, 2, 2, 5, 6, 9, 15, 20, 20, 20, 20, 35, 48, 55, 55, 65, 77]
# O podemos llamar a sort y devolver -1, 0 o -1 dependiendo de
# cómo queremos ordenar, en este caso es de manera descendente
edades_descendentes = edades.sort{ |a, b|
if a >= b
-1
elsif
a <= b
1
else
0
end
}
puts "Edades ordenadas de manera descendente: #{edades_descendentes}"
# [77, 65, 55, 55, 48, 35, 20, 20, 20, 20, 15, 9, 6, 5, 2, 2, 2, 1]
Así de simple es; nos pasa ambos valores que va a comparar y nosotros le indicamos cuál va primero y cuál después.
Eso sí, recuerda que esto devolverá un nuevo arreglo, ya que el arreglo original permanece intacto. Es importante ver el método de comparación en donde se regresa el valor dependiendo de la si uno es mayor, igual o menor al otro.
Lo mismo que se hace con números se puede hacer con cadena, vamos a ver. Por cierto, esto funciona tanto para flotantes como enteros.
Ruby permite comparar cadenas como si se tratara de números, pues las trata lexicográficamente; es decir, como en el alfabeto.
Por ejemplo, para Ruby, la letra “a” es menor que la “b” porque va antes en el alfabeto, igualmente la cadena “Luis” va antes de “María José” y así sucesivamente.
Nota: el operador nave espacial también compara cadenas.
=begin
Ordenar arreglos numéricos y de cadena con Ruby, sort y el operador <=>
@author parzibyte
=end
palabras = ["Ruby", "React", "Rust", "PostgreSQL", "Kotlin"]
puts "Palabras sin ordenar: #{palabras}"
# Lo mismo que los numéros, por defecto es ascendente
palabras_ascendente = palabras.sort
puts "Palabras ordenadas de manera ascendente: #{palabras_ascendente}"
# ["Kotlin", "PostgreSQL", "React", "Ruby", "Rust"]
# Pero igualmente podemos indicar el modo de ordenación; es lo mismo que
# arriba con el numérico pero usando <=> el cual devuelve -1, o 0 -1
# dependiendo de la compración de b y a
palabras_descendentes = palabras.sort{ |a, b| b <=> a}
puts "Palabras ordenadas de manera descendente: #{palabras_descendentes}"
# ["Rust", "Ruby", "React", "PostgreSQL", "Kotlin"]
Vemos que se hace lo mismo que se hace con los arreglos numéricos pero ahora usamos el operador nave espacial para aprovechar algunas cosas que provee el lenguaje y de esta forma regresar lo que el operador regresa.
Puedes descargar el código, instalar Ruby y ejecutar ruby archivo.rb
(en donde archivo es el nombre de tu archivo) y listo.
Así de simple se pueden ordenar arreglos en Ruby; estos son ejemplos básicos pero con ellos podemos aprender a ordenar arreglos de objetos u otras cosas como en JavaScript.
Te invito a ver más sobre Ruby y Algoritmos.
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…
Esta web usa cookies.