Rūšiuoti maišą pagal raktą, sugrąžinti maišą į Ruby

Ar tai bus geriausias būdas rūšiuoti maišą ir grąžinti Hash objektą (vietoj „Array“):

 h = {"a"=>1, "c"=>3, "b"=>2, "d"=>4} # => {"a"=>1, "c"=>3, "b"=>2, "d"=>4} Hash[h.sort] # => {"a"=>1, "b"=>2, "c"=>3, "d"=>4} 
216
02 дек. Vincentas yra nustatytas gruodžio 2 d. 2010-12-02 23:31 '10, 23:31, 2010-12-02 23:31
@ 9 atsakymai

Ruby 2.1 versijoje paprasta:

 h.sort.to_h 
164
11 марта '14 в 5:03 2014-03-11 05:03 Marko Thomas atsakymas kovo 14 d. 14 d. 5:03 2014-03-11 05:03

Pastaba Ruby> = 1.9.2 turi maišą, kuris išsaugo užsakymą: įterpiami užsakymo raktai, tai yra jų tvarka. Toliau pateikiamos senesnės versijos arba atvirkščiai suderinamas kodas.

Nėra rūšiuojamos maišos koncepcijos. Taigi, ne, ką darai neteisingai.

Jei norite, kad jis būtų surūšiuotas rodyti, grąžinkite eilutę:

 "{" + h.sort.map{|k,v| "#{k.inspect}=>#{v.inspect}"}.join(", ") + "}" 

arba jei norite, kad raktai būtų gerai:

 h.keys.sort 

arba jei norite gauti prieigą prie elementų pagal užsakymą:

 h.sort.map do |key,value| # keys will arrive in order to this block, with their associated value. end 

bet apskritai nėra prasmės kalbėti apie rūšiuojamą maišą. Iš docs : " Tvarkos , kurioje jūs perduodate maišą su raktu ar verte, gali atrodyti savavališka ir paprastai nebus įterpimo tvarka." Todėl raktų įterpimas tam tikroje eilutėje nėra naudingas.

78
02 дек. atsakymas, kurį pateikė Peter 02 Dec 2010-12-02 23:36 '10, 23:36, 2010-12-02 23:36

Aš visada naudoju sort_by . #sort_by išvestį reikia #sort_by su Hash[] , kad būtų rodomas maišos #sort_by , kitaip jis rodys masyvų masyvą. Arba galite paleisti #to_h metodą #to_h , kad jas #to_h į k=>v (maišos) struktūrą.

 hsh ={"a" => 1000, "b" => 10, "c" => 200000} Hash[hsh.sort_by{|k,v| v}] #or hsh.sort_by{|k,v| v}.to_h 

Į " yra panašus klausimas: kaip rūšiuoti simbolį" Ruby Hash "pagal skaičių?".

59
28 янв. Atsakymas pateikiamas boulder_ruby Jan 28 2014-01-28 21:16 '14, 21:16 2014-01-28 21:16

Ne, tai nėra (Ruby 1.9.x)

 require 'benchmark' h = {"a"=>1, "c"=>3, "b"=>2, "d"=>4} many = 100_000 Benchmark.bm do |b| GC.start b.report("hash sort") do many.times do Hash[h.sort] end end GC.start b.report("keys sort") do many.times do nh = {} h.keys.sort.each do |k| nh[k] = h[k] end end end end user system total real hash sort 0.400000 0.000000 0.400000 ( 0.405588) keys sort 0.250000 0.010000 0.260000 ( 0.260303) 

Dideliems maišams skirtumas padidės iki 10x ar daugiau.

13
27 июня '13 в 1:00 2013-06-27 01:00 atsakymas pateikiamas fl00r birželio 27 d. 13 val. 2013-06-27 01:00

Jūs Hash[h.sort] geriausią atsakymą sau OP: Hash[h.sort] Jei Hash[h.sort] daugiau funkcijų, čia galite keisti šaltinio maišą, kad jį surūšiuotumėte:

 h.keys.sort.each { |k| h[k] = h.delete k } 
12
12 июня '13 в 7:18 2013-06-12 07:18 atsakymą pateikė Borisas Stitnicky birželio 12 d. 13:18 2013-06-12 07:18

„ActiveSupport :: OrderedHash“ yra dar vienas variantas, jei nenorite naudoti rubino 1.9.2 ar sumažinti savo pačių problemą.

5
03 дек. atsakymas suteiktas 03 d. 2010-12-03 23:50 '10, 23:50, 2010-12-03 23:50
 @ordered = {} @unordered.keys.sort.each do |key| @ordered[key] = @unordered[key] end 
0
11 окт. atsakymas duotas beornborn 11 okt. 2013-10-11 14:48 '13, 14:48, 2013-10-11 14:48

Turėjau tą pačią problemą (turėjau rūšiuoti savo įrangą pagal jų pavadinimą), ir aš nusprendžiau:

 <% @equipments.sort.each do |name, quantity| %> ... <% end %> 

„@quepments“ yra maišelis, kurį sukūriau pagal savo modelį ir grįžau į savo valdiklį. Jei skambinate .sort, jis suskirstys hash pagal savo pagrindinę vertę.

0
31 июля '17 в 0:53 2017-07-31 00:53 atsakymą pateikė Gabriel Mesquita, liepos 31 d. 17, 0:53 2017-07-31 00:53

Man patiko sprendimas ankstesniame pranešime.

Aš padariau mini klasę, vadinamą class AlphabeticalHash . Jis taip pat turi metodą, vadinamą ap , kuris užima vieną argumentą ir Hash , kaip įvestį: ap variable . Akp į pp ( pp variable )

Tačiau jis (pabandys ir) atspausdins abėcėlinį sąrašą (jo raktus). Dunno, jei kas nors nori jį naudoti, jis yra kaip brangakmenis, galite jį įdiegti: gem install alphabetical_hash

Man tai gana paprasta. Jei kitiems reikia papildomos funkcijos, leiskite man žinoti, kad paversiu jį akmeniu.

EDITAS: kreditas siunčiamas į Petrą , kuris man davė šią idėją. :)

-3
14 апр. Atsakyti atsižvelgiant shevy 14 Bal 2012-04-14 04:31 '12 at 4:31 2012-04-14 04:31

Kiti klausimai apie etikečių arba Ask a question