Métodos de clasificación de matrices en Ruby

click fraud protection

La clasificación fue una preocupación para los informáticos desde el principio. Habia muchos algoritmos que entró y cayó en desuso y aún hoy los nuevos algoritmos están empujando los límites del rendimiento. Al ser un lenguaje de alto nivel, no implementará algoritmos de clasificación en Rubí si te importa el rendimiento y, además, la clasificación Matrices y otras colecciones son aún más cosas que Ruby hace por ti.

Técnicamente, la clasificación es un trabajo manejado por el módulo Enumerable. El módulo Enumerable es lo que une todos los tipos de colecciones en Ruby. Maneja iterar sobre colecciones, ordenar, mirar y encontrar ciertos elementos, etc. Cómo Enumerable clasifica una colección es un misterio, o al menos debería seguir siéndolo. El algoritmo de clasificación real es irrelevante, lo único que necesita saber es que los objetos de la colección se comparan utilizando el "operador de nave espacial".

El "operador de nave espacial" toma dos objetos, los compara y luego devuelve -1, 0 o 1. Eso es un poco vago, pero el operador en sí no tiene un comportamiento muy bien definido. Tomemos objetos numéricos por ejemplo. Si tienes dos objetos numéricos

instagram viewer
un y siy evaluar a <=> b, ¿a qué se evaluará la expresión? En el caso de Numerics, es fácil saberlo. Si a es mayor que b, será -1, si son iguales será 0 y si b es mayor que a, será 1. Esto se usa para decirle al algoritmo de clasificación cuál de los dos objetos debe ir primero en el formación. Solo recuerde que si el operando de la izquierda debe ser el primero en la matriz, debe evaluar a -1, si la mano derecha debe ser la primera, debe ser 1, y si no importa, debe ser 0.

No siempre sigue reglas tan ordenadas. ¿Qué sucede si usa este operador en dos objetos de diferentes tipos? Probablemente obtendrás una excepción. Que pasa cuando llamas 1 <=> 'mono'? Esto será el equivalente a llamar 1. <=> ('Mono'), lo que significa que el método real se llama en el izquierda operando y Fixnum # <=> devuelve nil si el operando de la derecha no es numérico. Si el operador devuelve nil, el método de clasificación generará una excepción. Entonces, antes de ordenar las matrices, asegúrese de que contengan objetos que se puedan ordenar.

En segundo lugar, el comportamiento real del operador de la nave espacial no está definido. Solo se define para algunas de las clases base, y para sus clases personalizadas, depende totalmente de usted lo que quiere que signifiquen. Si tienes un Estudiante clase puede hacer que el estudiante ordene por apellido, nombre, grado o una combinación de eso. Así que siempre tenga en cuenta que el comportamiento del operador de la nave espacial y la clasificación no está bien definido para nada más que los tipos base.

Tiene una matriz de objetos numéricos y desea ordenarlos. Hay dos métodos principales para hacer esto: ordenar y ¡ordenar!. El primero crea una copia de la matriz, la ordena y la devuelve. El segundo ordena la matriz en su lugar.

Eso se explica por sí mismo. Así que vamos a llevarlo a un nivel superior. ¿Qué pasa si no quieres confiar en el operador de la nave espacial? ¿Qué pasa si quieres un comportamiento completamente diferente? Estos dos métodos de clasificación toman un parámetro de bloque opcional. Ese bloque toma dos parámetros y debería arrojar valores al igual que el operador de la nave espacial: -1, 0 y 1. Entonces, dada una matriz, queremos ordenarla de modo que todos los valores que sean divisibles por 3 sean lo primero, y todos los demás sean posteriores. El orden real no importa aquí, solo que los divisibles por 3 son lo primero.

¿Como funciona esto? Primero, observe el argumento de bloque para el método de clasificación. En segundo lugar, observe las divisiones de módulo realizadas en los parámetros de bloque y la reutilización del operador de la nave espacial. Si uno es un múltiplo de 3, el módulo será 0, de lo contrario, será 1 o 2. Como 0 se ordenará antes que 1 o 2, aquí solo importa el módulo. El uso de un parámetro de bloque es particularmente útil en matrices que tienen más de un tipo de elemento, o cuando desea ordenar en clases personalizadas que no tienen un operador de nave espacial definido.

Hay un método de clasificación más, llamado ordenar por. Sin embargo, primero debe comprender la traducción de matrices y colecciones con el mapa antes de abordar sort_by.

instagram story viewer