Metode razvrščanja nizov v Rubyju

Razvrščanje je bilo za računalničarje že od začetka preokupacija. Bilo jih je veliko algoritmi ki so prišli v uporabo in izpadli iz uporabe in še danes novi algoritmi premikajo meje učinkovitosti. Ker je jezik na visoki ravni, v njem ne boste izvajali algoritmov za razvrščanje Ruby če vam je mar za uspešnost in poleg tega tudi razvrščanje Nizi in druge zbirke so še več stvari, ki jih Ruby počne za vas.

Tehnično je razvrščanje opravilo, ki ga upravlja modul Enumerable. Modul Enumerable je tisto, kar povezuje vse vrste zbirk v Rubyju skupaj. Obravnava iteriranje po zbirkah, razvrščanje, pregledovanje in iskanje določenih elementov itd. Kako številna razvrstitev zbirke je nekoliko skrivnost ali pa naj vsaj ostane. Dejanski algoritem razvrščanja ni pomemben, edino kar morate vedeti je, da se predmeti v zbirki primerjajo z uporabo "operaterja vesoljske ladje."

"Operater vesoljske ladje" vzame dva predmeta, jih primerja in nato vrne -1, 0 ali 1. To je nekoliko nejasno, vendar sam operater nima zelo natančno opredeljenega vedenja. Vzemimo za primer Numerične predmete. Če imate dva številčna predmeta

instagram viewer
a in b, in oceni a <=> b, na kaj bo izraz izrazil? V primeru Numerike je to enostavno povedati. Če je a večji od b, bo to -1, če sta enaka, bo 0 in če je b večji od a, bo enak 1. S tem se pove algoritmu za razvrščanje, kateri od obeh predmetov bi moral iti prvi v matrika. Samo zapomnite si, da če bo levi opernd prišel prvi v nizu, bi moral oceniti na -1, če je desna prva, naj bo 1, če ni pomembno, pa naj bo 0.

Vedno ne sledi tako urejenim pravilom. Kaj se zgodi, če tega operaterja uporabljate na dveh objektih različnih vrst? Verjetno boste dobili izjemo. Kaj se zgodi, ko pokličete 1 <=> 'opica'? To bo enakovredno klicu 1. <=> ('opica'), kar pomeni, da se dejanska metoda prikliče na levo operand in Fixnum # <=> vrne nič, če desni operand ni številčni. Če operater vrne nič, bo način sortiranja povzročil izjemo. Pred razvrstitvijo nizov se prepričajte, da vsebujejo predmete, ki jih je mogoče razvrstiti.

Drugič, dejansko vedenje operaterja vesoljske ladje ni določeno. Določen je le za nekatere osnovne razrede, za vaše razrede po meri pa je povsem odvisno od tega, kaj želite. Če imate a Študent razreda lahko študent razvrstite po priimku, imenu, stopnji ali kombinaciji tega. Zato se vedno zavedajte, da obnašanje operaterja in razvrščanja vesoljske ladje ni dobro določeno za nič, razen za osnovne vrste.

Imate Niz številskih predmetov in jih želite razvrstiti. Za to obstajata dva glavna načina: razvrsti in razvrsti!. Prvi ustvari kopijo matrike, jo razvrsti in vrne. Drugi razvrsti matriko na mestu.

To je precej samoumevno. Torej vzemimo zarezo. Kaj pa, če se ne želite zanašati na operaterja vesoljske ladje? Kaj pa, če želite popolnoma drugačno vedenje? Ta dva načina razvrščanja sprejemata neobvezen blok parameter. Ta blok ima dva parametra in mora prinesti vrednosti tako, kot to počne operater vesoljske ladje: -1, 0 in 1. Torej, glede na matriko, ga želimo razvrstiti tako, da pridejo na prvo mesto vse vrednosti, ki jih je mogoče deliti s tremi, vse druge pa sledijo. Dejanski vrstni red tukaj ni pomemben, le da so prvi tisti, ki jih delimo s 3.

Kako to deluje? Najprej upoštevajte argument bloka na način razvrščanja. Drugič, upoštevajte razdelitev modulov na blokovne parametre in ponovno uporabo operaterja vesoljske ladje. Če je eden večkratnik 3, bo modul enak 0, sicer bo 1 ali 2. Ker bo 0 razvrščena pred 1 ali 2, je tu pomemben samo modul. Uporaba parametra bloka je še posebej uporabna v nizih, ki vsebujejo več vrst elementov, ali kadar želite razvrstiti v razrede po meri, ki nimajo določenega operaterja vesoljske ladje.

Obstaja še ena metoda sortiranja, imenovana Razvrsti po. Vendar morate najprej razumeti prevajanje nizov in zbirk s karto, preden se lotite vrste_by.

instagram story viewer