Erinevus .sorti ja .sort_by vahel rubinis

Allikas: https://i1.wp.com/altereddimensions.net/main/wp-content/uploads/2016/09/image-36.png

Lõpetasin just Flatironi koolis oma tarkvaratehnika immersiivse töötamise teise nädala ja teen lahti erinevuse .sort ja .sort_by vahel Ruby's. Esmajärjekorras sattusin .sort_by, kui töötasin oma programmi eeltöö viimases laboris. Labori nimi oli „Esperanto keeles tähestik”, viidates rahvusvahelisele abikeelele, mida nimetatakse esperanto keeles. Väljakutse? Kirjutada meetod, mis aktsepteerib stringi massiivi ja sorteerib need tähestiku järgi esperanto tähestiku järgi. Lahendasin labori .sort_by abil, kuid isegi siis polnud ma kindel, kuidas .sort_by töötab "kapoti all" ja kuidas see erineb .sortist. Niisiis, ma otsustasin sukelduda. Siin on see, mida ma õppisin.

Kuidas .sort töötab:

.sort on Ruby loendur, mis võrdleb massiivi kahte elementi korraga. Seda saab kutsuda plokiga või ilma, kuid kui plokki kutsutakse, nõuab plokk kaht argumenti, mis tähistavad kahte võrreldavat asja. Ilma plokkideta kutsutakse .sort vaikimisi võrdlusmeetodi <=> operaatorile (tavaliselt nimetatakse seda kosmoselaeva operaatoriks). Kosmoselaeva operaator käivitab kaskaadse if / elsif / else avalduse, mis tagastab 0, kui kaks operandi on üksteisega võrdsed, -1, kui esimene operand on väiksem kui teine, ja 1, kui esimene operand on suurem kui teine. Need tagasiväärtused segavad elemente loendis üles ja alla, kuni need on määratud järjekorras.

Kuidas .sort_by töötab:

Vastupidiselt .sortile tuleb .sort_by kasutada koos plokiga ja see võtab ainult ühe argumendi. .Sort_by kasutamisel soovite tavaliselt argumenti mingil viisil manipuleerida, et muuta see sorteeritavaks. Näiteks kui soovite sortida massiivi stringi pikkuse järgi, helistaksite:

string_array.sort_by {| string | string.length}

.sort_by töötab luues seda, mida võite mõelda nähtamatuks räsi. Massiivile kutsumisel arvutab ta arvuklahvide komplekti (tuntud kui “sortimisvõtmed”) ja määrab massiivi iga elemendi ühele neist sortimisklahvidest. Seejärel sorteeritakse klahvid ja kaardistatakse tagasi algsetele väärtustele. Tagastatav väärtus on sorteeritud massiiv.

Selle erinevuse tõttu jagagem lahendus järgmiselt: „Esperanto keeles tähestik”.

Alustuseks oletagem, et massiiv, mida me tahaksime esperanto tähestiku järgi tähestikku lisada, on järgmine:

laused_array = ["mi amas programadon", "ruby estas mia plej ŝatata lingvo", "ni ordigu ĉi tiujn frazojn", "laboru fervore ludu fervore", "ĉu vi ŝatas kodon"]

Vajame ka järgmist konstanti:

ESPERANTO_ALPHABET = "abcĉdefgĝhĥijĵklmnoprsŝtuŭvz"

Ja see on minu kirjutatud meetod, mille ma järk-järgult lahti pakkin:

See toimib järgmiselt:

Samm 1.

lause_array.sort_by do | lause |

Selle reaga kutsun ma lause_array meetodit .sort_by. Massiivi iga lause kantakse plokki kui „lause”. Nii saab esimest korda läbi lause „mi amas programadon” (kas pole see tõde?).

2. samm.

lause.split (""). kaart tegema | märk |
  ESPERANTO_ALPHABET.index (märk)
lõpp

Ma muundan lause massiiviks, kus massiivi iga element on lauses täht. Seejärel kutsun ma selle massiivi .map, mis tähendab, et kaardistan uue väärtuse vastavalt plokis sisalduvale koodile iga tähemassiivi elemendile. Nii saab tähtede massiivis sama palju elemente kui algselt, kuid iga element teisendatakse.

Näiteks kui lause on „mi amas programadon”, muudetakse see massiiviks [„m”, „i“, „“, „a“, „m“, „a“, „s“, „„ , “P”, “r”, “o”, “g”, “r”, “a”, “m”, “a”, “d”, “o”, “n”]. Selle massiivi iga element kantakse plokki tähemärgina.

Esimene element, mida me nimetame märgiks, on "m". Plokk helistab:

ESPERANTO_ALPHABET.index ("m")

.index (), kui stringi kutsutakse, paljastab, milline stringi täht (numbriliselt) vastab argumendile .index () edastatule (pidage meeles, et stringid, nagu massiivid, on 0-indekseeritud) . Sel juhul vastab “m” indeksile 16 ESPERANTO_ALPHABET-is, seega asendab 16 tähtede massiivis “m”. Silmuse lõpuks näeb meie algne massiiv välja järgmine:

["16", "11", "null", "0", "16", "0", "21", "null", "19", "20", "18", "7", " 20 "," 0 "," 16 "," 0 "," 4 "," 18 "," 17 "]

1. ja 2. toiming toimub kõigi lausete algse lause iga lause korral.

3. samm:

Nüüd on aeg .sort_by maagiaks. Meil on viis lauset (praegu massiividena koos täisarvudega elementidena), nii et kujutage ette, et .sort_by genereerib viis numbriklahvi: 1, 2, 3, 4 ja 5. See määrab esimese lause (pidage meeles, et seda tähistab praegu massiiv) mis sisaldab hunnist täisarvu) esimese võtmeni. Siis tuleb teine ​​lause (mida tähistab ka massiiv, mis sisaldab hunnikut täisarvu). Kui teise lause esimene täisarv on väiksem kui esimese lause esimene täisarv, omistatakse teine ​​lause klahvile 1 ja esimene lause põrkub 2-klahvini. Ja nii edasi. Lõpuks võite kujutleda räsi, mis näeb välja selline:

sorted_hash = {
  "1" => ["3", "24", "null", "26", "11", "22", "0", "23", "0", "21", "null", "14", "18", "4", "18", "17"],
  "2" => ["15", "0", "1", "18", "20", "24", "null", "6", "5", "20", "26", "18", "20", "5", "null", "15", "24", "4", "24", "null", "6", "5", "20", "26" "," 18 "," 20 "," 5 "],
  "3" => ["16", "11", "null", "0", "16", "0", "21", "null", "19", "20", "18", "7", "20", "0", "16", "0", "4", "18", "17"],
  "4" => ["17", "11", "null", "18", "20", "4", "11", "7", "24", "null", "3", "11", "null", "23", "11", "24", "12", "17", "null", "6", "20", "0", "27", "18 "," 12 "," 17 "],
  "5" => ["20", "24", "1", "null", "null", "5", "21", "23", "0", "21", "null", "16", "11", "0", "19", "15", "5", "12", "null", "22", "0", "23", "0", "23 "," 0 "," null "," 15 "," 11 "," 17 "," 7 "," 26 "," 18 "]
}

Järgmisena kaardistab .sort_by meetod need sortimisklahvid algsetele väärtustele:

sorted_hash = {
  "1" => "viu vi ŝatas kodon",
  "2" => "laboru fervore ludu fervore",
  "3" => "mi amas programadon",
  "4" => "ni ordigu ĉi tiujn frazojn",
  "5" => "ruby estas mia plej ŝatata lingvo"
}

Lõpuks tagastab .sort_by meetod massiivi koos elementidega järjekorras:

["ĉu vi ŝatas kodon", "laboru fervore ludu fervore", "mi amas programadon", "ni ordigu ĉi tiujn frazojn", "ruby estas mia plej ŝatata lingvo"]

Ja see ongi kõik! Nr. Kosmoselaevu koos .sort_by; selle asemel on kõik seotud sortimisklahvidega.