Rubyda .sort va .sort_by o'rtasidagi farq

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

Men Flatiron maktabida Software Engineering Immersive dasturining ikkinchi haftasini yakunladim va Rubyda .sort va .sort_by o'rtasidagi farqni olib tashlamoqchiman. Dastlabki ishdan oldin oxirgi laboratoriyada ishlayotganda .sort_by ga tushdim. Laboratoriya "Esperanto tilida alifbo yozish" deb nomlangan, bu xalqaro yordamchi til Esperanto deb nomlanadi. Qiyinmi? Bir qator satrlarni qabul qiladigan va esperanto alifbosi bo'yicha alifbo tartibida tartiblash usulini yozish. Men laboratoriyani .sort_by-dan foydalanib hal qildim, ammo shunga qaramay, qanday qilib .sort_by "kaput ostida" qanday ishlashini va uning qanday qilib .sortdan farq qilishini bilmasdim. Shunday qilib, men sho'ng'ishga qaror qildim. Mana men shu narsani bilib oldim.

.Sort qanday ishlaydi:

.sort - bir vaqtning o'zida massivdagi ikkita elementni taqqoslaydigan Yoqut raqami. Blok bilan yoki bo'lmagan holda chaqirish mumkin, lekin agar blok bilan chaqirilsa, blok ikkita dalilni talab qiladi, bu ikkala narsaning taqqoslanayotganini anglatadi. Bloksiz chaqirilganda .sort taqqoslash usuliga to'liq ishonadi <=> operatori (odatda kosmik kemaning operatori deb ataladi). Fazoviy kema operatori agar / agar ikkita operand bir-biriga teng bo'lsa, -1, agar birinchi operand ikkinchi darajadan past bo'lsa va 1 birinchi operand ikkinchisidan katta bo'lsa, 0 ni qaytaradigan if / elsif / else kaskadli harakatini amalga oshiradi. Qaytariladigan qiymatlar elementlarni belgilangan tartibda bo'lguncha yuqoriga va pastga aralashtiradi.

.Sort_by qanday ishlaydi:

.Sort, .sort_by dan farqli o'laroq, blokdan foydalanish kerak va blok faqat bitta argumentni oladi. .Sort_by-dan foydalanganda, odatda, uni tartiblash uchun argumentni biron bir tarzda boshqarishni xohlaysiz. Masalan, agar siz qatorlar qatorini uzunligi bo'yicha tartiblamoqchi bo'lsangiz, qo'ng'iroq qilsangiz bo'ladi:

string_array.sort_by {| string | string.length}

.sort_by siz ko'rinmas hash deb hisoblashingiz mumkin bo'lgan narsalarni yaratib ishlaydi. Massiv chaqirilganda, u raqamli tugmachalarni ("tartiblash tugmachalari" deb nomlanuvchi) to'plamini hisoblab chiqadi va massivdagi har bir elementni ushbu nav tugmalaridan biriga tayinlaydi. Keyin, tugmachalar saralanadi va asl qiymatlarga qaytariladi. Qaytish qiymati tartiblangan qator.

Ushbu farqni hisobga olgan holda, keling, "Esperantoda alifbo yozish".

Yangi boshlanuvchilar uchun, esperanto alifbosi bo'yicha alfavit qilishni istagan qator quyidagicha deylik.

jumlalar_array = ["mi amas programadon", "ruby estas mia plej ŝatata lingvo", "ni ordigu ĉi tiujn frazojn", "labu farovon ludu fervore", "viu vi ŝatas kodon"]

Shuningdek, bizga quyidagilar kerak bo'ladi:

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

Va bu men yozgan usul, uni bosqichma-bosqich olib tashlayman:

Bu quyidagicha ishlaydi:

1-qadam.

jumlalar_array.sort_by do | jumlalar |

Ushbu chiziq yordamida men .sort_by metodini jumlalar_arrayida chaqiraman. Massivdagi har bir jumla "jumla" sifatida blokga kiritiladi. Shunday qilib, birinchi marta "jumla" "mi amas programadon" bo'ladi (shunday emasmi?).

2-qadam.

cümlə.split (""). xarita do | belgi |
  ESPERANTO_ALPHABET.index (belgi)
oxiri

Mana, men jumlalarni massivga aylantirmoqdaman, bu qatorning har bir elementi jumladagi harfdir. Keyin men ushbu massivda .map-ni chaqiraman, bu harflar massivining har bir elementiga blokdagi kod bo'yicha yangi qiymatni xaritaga kiritishni anglatadi. Shunday qilib, harflar qatori avvalgidek bir xil miqdordagi elementlarga ega bo'ladi, ammo har bir element o'zgartiriladi.

Masalan, agar "jumla" "mi amas programadon" bo'lsa, u massivga aylanadi ["m", "i", "," a "," m "," a "," s "," , "P", "r", "o", "g", "r", "a", "m", "a", "d", "o", "n"]. Ushbu massivdagi har bir element "belgi" sifatida blokga o'tkaziladi.

Biz "belgi" deb ataydigan birinchi element "m" dir. Blok quyidagi qo'ng'iroqlarni amalga oshiradi:

ESPERANTO_ALPHABET.index ("m")

.index () satr chaqirilganda, satrdagi qaysi harfni (sonli) argument sifatida .index () ga o'tgan narsalarga mos kelishini aniqlash orqali ishlaydi (shuni esda tutingki, satrlar, xuddi qatorlar, 0 indekslangan) . Bunday holda, "m" ESPERANTO_ALPHABET-dagi 16 indeksga to'g'ri keladi, shuning uchun harflar qatorida 16 "m" o'rniga o'tadi. Davr oxirida bizning asl massivimiz quyidagicha bo'ladi:

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

Birinchi va ikkinchi bosqichlar asl jumlalar_arrayidagi har bir jumla uchun amalga oshiriladi.

3-qadam:

Endi .sort_by sehrining vaqti keldi. Bizda beshta jumlalar bor (hozirda elementlar sifatida massivlar sifatida berilgan). Tasavvur qiling, .sort_by beshta raqamli tugmachani hosil qiladi: 1, 2, 3, 4 va 5. Birinchi so'zni tayinlaydi (eslang, hozirgi vaqtda u massiv bilan ifodalanadi) birinchi tugmaga bir nechta butun sonlarni o'z ichiga olgan). Keyin ikkinchi jumla keladi (shuningdek, butun sonlarni o'z ichiga olgan qator bilan ifodalanadi). Agar ikkinchi jumladagi birinchi butun birinchi jumladagi birinchi butun sondan kam bo'lsa, ikkinchi jumla 1 tugmachasiga tayinlanadi va birinchi jumla 2 tugmachaga tushiriladi. Va hokazo. Oxir-oqibat, siz shunday ko'rinadigan hashni tasavvur qilishingiz mumkin:

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

Keyinchalik, .sort_by usuli ushbu saralash klavishlarini asl qiymatlarga xaritada qiladi:

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

Nihoyat, .sort_by metodi ketma-ketlikda elementlar bilan qatorni qaytaradi:

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

Va shu! .Sort_by bilan kosmik kemalar mavjud emas; buning o'rniga saralash tugmachalari haqida gap boradi.