Kuidas Ruby Hashi klahvide järgi tähestikulises järjekorras sortida

How Sort Ruby Hash Alphabetically Keys



Lahendus:

Eeldades, et soovite, et väljund oleks räsi, mis kordab klahve sorteeritud järjekorras, olete peaaegu kohal.Hash#sort_by tagastab anMassiivMassiivid ja sisemised massiivid on kõik kaks elementi.

Ruby omaHashil on konstruktor, mis suudab seda väljundit tarbida.



Proovi seda:



temp = Hash [temp.sort_by]

või kokkuvõtlikumalt



temp = temp.sort_by .to_h

Kui teie räsi sisaldab mitut tüüpi võtmeid, see ei tööta (Ruby ei sorteeri automaatseltStringid jaNäiteks sümbolid) ja saate veateate nagu sümboli ja stringiga võrdlemine ebaõnnestus (ArgumentError) . Kui jah, siis võite muuta ülaltoodut

temp = Hash [temp.sort_by key.to_s]

probleemi lahendamiseks. Siiski tuleb hoiatada, et võtmed säilitavad oma esialgse tüübi, mis võib hilisemas koodis eeldustega probleeme tekitada. Samuti toetab enamik sisseehitatud klasse a.to_s meetodit, nii et võite saada soovimatuid tulemusi (nt numbriklahvide ootamatu sortimisjärjestus või muud ootamatud tüübid).

Sa võiksid, lisaks , teisendage võtmedStringid midagi sellist:



temp = Hash [temp.map võti, val.sort]

. . . kuigi see lähenemine kaotaks teavet algse võtme tüübi kohta, mistõttu oleks võimatu algsetele andmetele usaldusväärselt tagasi viidata.


sorted_by_key = Hash [original_hash.sort]

loob uue räsimärgi, sisestades võtme/väärtusedoriginal_hash tähestikulises võtmes. Ruby 2.x räsid mäletavad nende sisestamise järjekorda, nii et see uus räsi kuvatakse võtmete järgi sorteerituna, kui loete selle või väljastate selle.

Kui sisestate rohkem elemente mitte tähestikulises järjekorras, siis see muidugi ei kehti.

Samuti eeldatakse, et algsed räsiklahvid on sorteeritavad/võrreldavad.


Ruby's Hash mäletab selle sisestamise järjekorda tänapäeval, kuid varasemaid Rubies

See erineb massiivist, mis toimib nagu järjestikune/tekstifail või kett või järjekord ning peate sellele lineaarselt juurde pääsema, seda kordades, mis sel hetkel muudab elementide järjestuse suureks.

Niisiis, hasi abil hankige võtmed, sorteerige need ja korrake klahvide loendit või kasutagevalues_at, et kõik väärtused korraga alla laadida. Näiteks:

hash = {'z' => 9, 'a' => 1} sorted_keys = hash.keys.sort # => ['a', 'z'] sorted_keys.each do | k | paneb räsi [k] lõpp # >> 1 # >> 9 hash.values_at (*sorteeritud_võtmed) # => [1, 9]

Mõni keel ei lase isegi räsi sortida ja sellele juurdepääs klahvide sorteeritud loendi kaudu on ainus viis elementide eraldamiseks järjekorras, seega on ilmselt hea mõte mitte harjuda lootma järjestusele võtme/väärtuse paarid ja tugineda selle asemel võtmetele.