Metode de sortare a arăturilor în rubin

click fraud protection

Sortarea a fost o preocupare pentru informaticieni încă de la început. Erau multi algoritmi care a intrat și a scăzut din uz și încă astăzi noi algoritmi împing granițele performanței. Fiind un limbaj la nivel înalt, nu veți implementa algoritmi de sortare în Rubin dacă vă pasă de performanță și, pe lângă asta, de sortare Arrays și alte colecții sunt încă multe lucruri pe care Ruby le face pentru tine.

Tehnic, sortarea este o lucrare gestionată de modulul Enumerable. Modulul Enumerable este ceea ce leagă toate tipurile de colecții din Ruby. Se ocupă cu iterarea colecțiilor, sortarea, căutarea și găsirea anumitor elemente etc. Cum Enumerable sortează o colecție este un pic de mister, sau cel puțin ar trebui să rămână așa. Algoritmul de sortare propriu-zis este irelevant, singurul lucru pe care trebuie să-l știi este că obiectele din colecție sunt comparate folosind „operatorul navei spațiale”.

„Operatorul navei spațiale” ia două obiecte, le compară și apoi returnează -1, 0 sau 1. Este un pic vag, dar operatorul în sine nu are un comportament foarte bine definit. Să luăm de exemplu obiecte numerice. Dacă aveți două obiecte numerice

instagram viewer
A și b, și evaluați a <=> b, ce va evalua expresia? În cazul numericilor, este ușor de spus. Dacă a este mai mare decât b, va fi -1, dacă sunt egale va fi 0 și dacă b este mai mare decât a, va fi 1. Acest lucru este utilizat pentru a spune algoritmul de sortare care dintre cele două obiecte ar trebui să meargă mai întâi în mulțime. Amintiți-vă doar că, dacă operandul din stânga trebuie să vină pe primul loc în tablou, ar trebui să se evalueze până la -1, dacă mâna dreaptă ar trebui să fie prima, ar trebui să fie 1, iar dacă nu contează, ar trebui să fie 0.

Nu respectă întotdeauna reguli atât de ordonate. Ce se întâmplă dacă utilizați acest operator pe două obiecte de diferite tipuri? Probabil veți primi o excepție. Ce se întâmplă când suni 1 <=> „maimuță”? Acesta va fi echivalentul apelului 1. <=> ( 'Maimuță'), adică se apelează la metoda efectivă stânga operand si Fixnum # <=> returnează nul dacă operandul din dreapta nu este un număr. Dacă operatorul returnează nul, metoda de sortare va ridica o excepție. Deci, înainte de a sorta matricile, asigurați-vă că conțin obiecte care pot fi sortate.

În al doilea rând, comportamentul real al operatorului navei spațiale nu este definit. Este definit doar pentru unele dintre clasele de bază, iar pentru clasele dvs. personalizate, depinde în totalitate de dvs. ceea ce doriți să însemne. Dacă aveți un Student clasa pe care o puteți avea la dispoziția elevilor după nume, prenume, nivel de clasă sau o combinație a acestora. Așadar, este întotdeauna conștient că comportamentul operatorului național spațial și sortarea nu este bine definit pentru altceva decât pentru tipurile de bază.

Aveți o serie de obiecte numerice și doriți să le sortați. Există două metode principale pentru a face acest lucru: fel și fel!. Primul creează o copie a tabloului, o sortează și o returnează. Al doilea sortează tabloul în loc.

Este destul de auto-explicativ. Deci, să luăm o notch. Ce se întâmplă dacă nu doriți să vă bazați pe operatorul navei spațiale? Ce se întâmplă dacă doriți un comportament complet diferit? Aceste două metode de sortare iau un parametru opțional de bloc. Blocul respectiv are doi parametri și ar trebui să dea valori la fel cum face operatorul navelor spațiale: -1, 0 și 1. Deci, având în vedere un tablou, vrem să-l sortăm astfel încât toate valorile divizibile cu 3 să vină pe primul loc, iar toate celelalte vin după. Ordinea reală nu contează aici, doar că primele divizibile sunt 3.

Cum funcționează asta? Mai întâi, notează argumentul de bloc la metoda de sortare. În al doilea rând, notați diviziunile de modulo realizate pe parametrii blocului și reutilizarea operatorului navei spațiale. Dacă unul este multiplu de 3, modulul va fi 0, în caz contrar, va fi 1 sau 2. Deoarece 0 va sorta înainte de 1 sau 2, aici doar modulul contează. Utilizarea unui parametru de bloc este utilă în special în tablourile care au mai mult de un tip de element sau atunci când doriți să sortați pe clase personalizate care nu au un operator spațial definit.

Există încă o metodă de sortare, numită filtrează după. Cu toate acestea, ar trebui să înțelegeți mai întâi traducerea tablourilor și colecțiilor cu harta înainte de a aborda sort_by.

instagram story viewer