Metodi di ordinamento delle matrici in Ruby

L'ordinamento era una preoccupazione per gli informatici fin dall'inizio. Ce n'erano molti algoritmi che è venuto fuori uso e che ancora non funziona e ancora oggi nuovi algoritmi stanno spingendo i limiti delle prestazioni. Essendo un linguaggio di alto livello, non implementerai algoritmi di ordinamento Rubino se ti interessano le prestazioni e, inoltre, l'ordinamento Array e altre collezioni sono ancora più cose che Ruby fa per te.

Tecnicamente, l'ordinamento è un lavoro gestito dal modulo Enumerable. Il modulo Enumerable è ciò che unisce tutti i tipi di raccolte in Ruby. Gestisce l'iterazione delle raccolte, l'ordinamento, la ricerca e la ricerca di determinati elementi, ecc. Come Enumerable ordina una collezione è un po 'un mistero, o almeno dovrebbe rimanere tale. L'attuale algoritmo di ordinamento è irrilevante, l'unica cosa che devi sapere è che gli oggetti nella collezione vengono confrontati usando l'operatore "astronave".

L '"operatore di astronave" prende due oggetti, li confronta e quindi restituisce -1, 0 o 1. È un po 'vago, ma l'operatore stesso non ha un comportamento ben definito. Prendiamo ad esempio gli oggetti numerici. Se hai due oggetti numerici

instagram viewer
un' e Be valutare a <=> b, a cosa valuterà l'espressione? Nel caso di Numerics, è facile da dire. Se a è maggiore di b, sarà -1, se sono uguali sarà 0 e se b è maggiore di a, sarà 1. Questo è usato per dire all'algoritmo di ordinamento quale dei due oggetti dovrebbe andare per primo nel file Vettore. Ricorda solo che se l'operando di sinistra deve venire per primo nell'array, dovrebbe valutare -1, se la mano destra dovrebbe essere la prima dovrebbe essere 1 e se non importa dovrebbe essere 0.

Non segue sempre regole così ordinate. Cosa succede se si utilizza questo operatore su due oggetti di diverso tipo? Probabilmente otterrai un'eccezione. Cosa succede quando chiami 1 <=> "scimmia"? Questo sarà l'equivalente della chiamata 1. <=> ( 'Scimmia'), il che significa che il metodo effettivo viene chiamato sul sinistra operando e Fixnum # <=> restituisce zero se l'operando di destra non è un numero. Se l'operatore restituisce zero, il metodo di ordinamento genererà un'eccezione. Pertanto, prima di ordinare le matrici, assicurarsi che contengano oggetti che possono essere ordinati.

In secondo luogo, il comportamento effettivo dell'operatore dell'astronave non è definito. È definito solo per alcune delle classi di base e per le tue classi personalizzate, dipende totalmente da te quello che vuoi che significino. Se hai un Alunno in classe puoi ordinare gli studenti per cognome, nome, livello scolastico o una combinazione di questi. Quindi sii sempre consapevole del fatto che il comportamento dell'operatore dell'astronave e l'ordinamento non sono ben definiti per nient'altro che i tipi di base.

Hai una matrice di oggetti numerici e desideri ordinarli. Esistono due metodi principali per eseguire questa operazione: ordinare e ordinare!. Il primo crea una copia dell'array, lo ordina e lo restituisce. Il secondo ordina l'array in posizione.

È piuttosto autoesplicativo. Quindi facciamo un passo avanti. Cosa succede se non si desidera fare affidamento sull'operatore dell'astronave? E se desideri un comportamento completamente diverso? Questi due metodi di ordinamento accettano un parametro di blocco opzionale. Quel blocco accetta due parametri e dovrebbe fornire valori esattamente come l'operatore dell'astronave: -1, 0 e 1. Quindi, dato un array, vogliamo ordinarlo in modo che tutti i valori divisibili per 3 vengano prima, e tutti gli altri vengano dopo. Qui l'ordine reale non ha importanza, solo che quelli divisibili per 3 vengono prima.

Come funziona? Innanzitutto, annota l'argomento block al metodo di ordinamento. In secondo luogo, prendere nota delle divisioni del modulo eseguite sui parametri del blocco e del riutilizzo dell'operatore dell'astronave. Se uno è un multiplo di 3, il modulo sarà 0, altrimenti sarà 1 o 2. Poiché 0 verrà ordinato prima di 1 o 2, qui è importante solo il modulo. L'uso di un parametro di blocco è particolarmente utile nelle matrici che hanno più di un tipo di elemento o quando si desidera ordinare su classi personalizzate che non hanno un operatore di astronave definito.

Esiste un altro metodo di ordinamento, chiamato ordina per. Tuttavia, dovresti prima comprendere la traduzione di matrici e raccolte con la mappa prima di affrontare sort_by.