Menetelmät taulukkojen lajitteluun Rubyssa

Lajittelu oli tietokonetieteilijöiden huolenaihe varhaisesta lähtien. Siellä oli monia algoritmit joka tuli käytöstä ja hävisi käytöstä, ja vielä tänäkin päivänä uudet algoritmit ajavat suorituskyvyn rajoja. Koska olet korkean tason kieli, et ota käyttöön lajittelualgoritmeja Rubiini jos välität suorituskyvystä ja lisäksi lajittelusta taulukot ja muut kokoelmat ovat vielä enemmän asioita, joita Ruby tekee sinulle.

Lajittelu on teknisesti Enumerable-moduulin käsittelemää työtä. Enumerable-moduuli sitoo kaiken tyyppiset kokoelmat Rubyssa. Se hoitaa kokoelmien iteroinnin, tiettyjen elementtien lajittelun, etsimisen ja löytämisen jne. Kuinka Enumerable lajittelee kokoelman, on vähän mysteeri, tai ainakin sen pitäisi pysyä niin. Varsinaisella lajittelualgoritmilla ei ole merkitystä, ainoa asia, joka sinun on tiedettävä, on, että kokoelman objekteja verrataan "avaruusaluksen operaattorilla".

"Avaruusaluksen operaattori" ottaa kaksi objektia, vertaa niitä ja palauttaa sitten -1, 0 tai 1. Se on vähän epämääräinen, mutta itse käyttäjällä ei ole kovin hyvin määriteltyä käyttäytymistä. Otetaan esimerkiksi numeeriset objektit. Jos sinulla on kaksi numeerista objektia

instagram viewer
ja b, ja arvioida a <=> b, mihin lauseke arvioi? Numeroiden tapauksessa on helppo kertoa. Jos a on suurempi kuin b, se on -1, jos ne ovat yhtä suuria, se on 0 ja jos b on suurempi kuin a, se on 1. Tätä käytetään kertomaan lajittelualgoritmi, minkä toisen objektin tulisi mennä ensin ryhmä. Muista vain, että jos vasemmanpuoleisen operandin on tarkoitus tulla ensimmäiseksi taulukossa, sen tulisi arvioida arvoon -1, jos oikeanpuoleisen tulisi olla ensin, sen tulisi olla 1 ja jos sillä ei ole väliä, sen pitäisi olla 0.

Se ei aina noudata sellaisia ​​siistejä sääntöjä. Mitä tapahtuu, jos käytät tätä operaattoria kahdessa erityyppisessä objektissa? Saat todennäköisesti poikkeuksen. Mitä tapahtuu, kun soitat 1 <=> 'apina'? Tämä vastaa kutsumista 1. <=> (Apinan), eli varsinaista menetelmää kutsutaan vasen operandi ja Fixnum # <=> palauttaa nollan, jos oikeanpuoleinen operandi ei ole numeerinen. Jos operaattori palauttaa nollan, lajittelutapa tuo poikkeuksen. Joten ennen taulukkojen lajittelua varmista, että ne sisältävät lajiteltavia objekteja.

Toiseksi, avaruusaluksen käyttäjän todellista käyttäytymistä ei ole määritelty. Se on määritelty vain joillekin perusluokista, ja räätälöityjen luokkiesi osalta on täysin vastuussa siitä, mitä haluat niiden tarkoittavan. Jos sinulla on Opiskelija luokka, voit saada opiskelijan lajittelemaan sukunimen, etunimen, palkkaluokan tai näiden yhdistelmän mukaan. Joten aina muista, että avaruusaluksen käyttäjän käyttäytyminen ja lajittelu eivät ole oikein määriteltyjä muille kuin pohjatyypeille.

Sinulla on joukko numeerisia objekteja ja haluat lajitella ne. Tätä varten on kaksi päämenetelmää: järjestellä ja järjestellä!. Ensimmäinen luo kopion taulukosta, lajittelee sen ja palauttaa sen. Toinen lajittelee taulukon paikalleen.

Se on aika itsestään selvää. Joten pidetään sitä lovi. Entä jos et halua luottaa avaruusaluksen operaattoriin? Entä jos haluat täysin erilaisen käytöksen? Nämä kaksi lajittelumenetelmää käyttävät valinnaisen lohkoparametrin. Tämä lohko ottaa kaksi parametria ja sen pitäisi tuottaa arvot samalla tavalla kuin avaruusaluksen operaattori: -1, 0 ja 1. Joten, ottaen huomioon taulukon, haluamme lajitella sen niin, että kaikki arvot, jotka voidaan jakaa kolmella, tulevat ensin, ja kaikki muut seuraavat. Varsinaisella järjestyksellä ei ole väliä täällä, vain että kolmella jaettavat ovat ensin.

Miten tämä toimii? Huomaa ensin lohkoargumentti lajittelumenetelmään. Toiseksi, huomioi lohkoparametreihin tehdyt modulojaot ja avaruusaluksen käyttäjän uudelleenkäyttö. Jos yksi on 3: n kerrannainen, modulo on 0, muuten se on 1 tai 2. Koska 0 lajitellaan ennen 1 tai 2, tässä on merkitystä vain moduulolla. Lohkoparametrin käyttäminen on erityisen hyödyllistä ryhmissä, joissa on useampaa kuin yhtä tyyppistä elementtiä, tai kun haluat lajitella mukautettuihin luokkiin, joilla ei ole määritettyä avaruusaluksen operaattoria.

On vielä yksi lajittelumenetelmä, nimeltään Järjestä. Sinun tulisi kuitenkin ensin ymmärtää taulukkojen ja kokoelmien kääntäminen kartalla ennen kuin käsittelet sort_by.

instagram story viewer