Metódy triedenia polí v Ruby

Triedenie bolo od počiatku počítačovým vedcom starosťou. Bolo ich veľa algoritmy ktoré vstúpili do používania a vypadli z používania a stále nové algoritmy posúvajú hranice výkonu. Ako jazyk vysokej úrovne nebudete implementovať triediace algoritmy rubín ak vám záleží na výkone a okrem toho na triedení poľa a ďalšie zbierky sú ešte viac vecí, ktoré pre vás Ruby robí.

Z technického hľadiska je triedenie úlohou, ktorú vykonáva modul Enumerable. Modul Enumerable je to, čo spája všetky typy zbierok v Ruby. Zaoberá sa opakovaním zbierok, triedením, prezeraním a nájdením určitých prvkov atď. To, ako Enumerable triedi kolekciu, je trochu záhadou, alebo by to aspoň malo zostať. Skutočný algoritmus triedenia nie je relevantný, jediné, čo potrebujete vedieť, je to, že objekty v kolekcii sa porovnávajú pomocou „operátora kozmickej lode“.

„Operátor kozmickej lode“ vezme dva objekty, porovná ich a potom vráti -1, 0 alebo 1. To je trochu vágne, ale samotný operátor nemá veľmi dobre definované správanie. Zoberme si napríklad numerické objekty. Ak máte dva číselné objekty

instagram viewer
a ba vyhodnotiť a <=> b, na čo sa výraz vyhodnotí? V prípade číselníka je ľahké povedať. Ak a je väčšie ako b, bude to -1, ak sú rovnaké, bude to 0 a ak b je väčšie ako a, bude to 1. Používa sa na určenie triediaceho algoritmu, ktorý z týchto dvoch objektov by mal ísť ako prvý v systéme rad. Nezabudnite, že ak má ľavý operand na prvom mieste v poli, mal by vyhodnotiť -1, ak pravá ruka by mala byť prvá, mala by byť 1 a ak nezáleží na tom, mala by byť 0.

Nie vždy sa riadi týmito pravidlami upratovania. Čo sa stane, ak použijete tento operátor na dva objekty rôznych typov? Pravdepodobne dostanete výnimku. Čo sa stane, keď zavoláte 1 <=> „opica“? Bude to ekvivalent hovoru 1. <=> ( 'Opice'), čo znamená, že sa na internete volá skutočná metóda left operand a Fixnum # <=> vráti nulovú hodnotu, ak pravý operand nie je číselný. Ak operátor vráti nulu, metóda triedenia vyvolá výnimku. Pred zoradením polí sa preto uistite, že obsahujú objekty, ktoré je možné triediť.

Po druhé, nie je definované skutočné správanie operátora kozmickej lode. Je to definované iba pre niektoré základné triedy a pre vaše vlastné triedy je úplne na vás, čo chcete, aby znamenali. Ak máte študent triedy môžete študenta zoradiť podľa priezviska, krstného mena, platovej triedy alebo ich kombinácie. Preto si vždy uvedomte, že správanie operátora a triedenie lode nie je pre nič iné ako pre základné typy dobre definované.

Máte pole numerických objektov a vy ich chcete zoradiť. Existujú dve základné metódy, ako to urobiť: druh a sort!. Prvý vytvorí kópiu poľa, zoradí ju a vráti ju. Druhý zoradí pole na mieste.

To je celkom samozrejmé. Tak poďme na to. Čo ak sa nechcete spoliehať na prevádzkovateľa kozmickej lode? Čo ak chcete úplne iné správanie? Tieto dve metódy triedenia majú voliteľný parameter bloku. Tento blok má dva parametre a mal by poskytovať hodnoty presne tak, ako to robí operátor kozmickej lode: -1, 0 a 1. Takže, vzhľadom na pole, chceme to zoradiť tak, aby všetky hodnoty, ktoré sú deliteľné 3, boli na prvom mieste a všetky ostatné potom. Skutočný poriadok tu nezáleží, len to, že tí, ktorí sú deliteľní tromi, sú na prvom mieste.

Ako to funguje? Najprv si všimnite argument blokovania pre metódu zoradenia. Po druhé, všimnite si rozdelenie modulov vykonané na parametroch bloku a opakované použitie operátora kozmickej lode. Ak je jeden násobok 3, modulo bude 0, inak to bude 1 alebo 2. Pretože 0 bude zoradené pred 1 alebo 2, záleží iba na module. Použitie parametra block je užitočné najmä v poliach, ktoré majú viac ako jeden typ prvku, alebo ak chcete zoradiť vlastné triedy, ktoré nemajú definovaného operátora vesmírnej lode.

Existuje ešte jedna metóda triedenia, ktorá sa nazýva triediť podľa. Najprv by ste však mali pochopiť preklad polí a kolekcií s mapou skôr, ako začnete riešiť sort_by.

instagram story viewer