Ruby

Ordenar arreglos numéricos y de cadenas con Ruby

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í:

 <=>

Ordenar arreglos en Ruby, arreglos de cadenas y numéricos de forma ascendente y descendente

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.

Aclaración antes de todo

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.

¿Cómo funciona el ordenamiento?

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:

Comparando valores en Ruby con el operador nave espacial

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.

Ordenar arreglos numéricos con Ruby

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.

Ordenar arreglos de cadena con Ruby

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.

Probar ejemplos o descargar

Puedes descargar el código, instalar Ruby y ejecutar ruby archivo.rb (en donde archivo es el nombre de tu archivo) y listo.

Conclusión

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.