Supponendo che si desideri che l'output sia un hash che eseguirà l'iterazione dei tasti in ordine ordinato, quindi ci si trova quasi arrivati. Hash#sort_by
restituisce un Array
di Array
s e gli array interni sono tutti e due gli elementi.
Ruby's Hash
ha un costruttore che può consumare questa uscita.
Prova questo:
temp = Hash[ temp.sort_by { |key, val| key } ]
Se il vostro hash ha mescolato tipi di chiave, questo non funzionerà (di Ruby non sarà automaticamente sorta tra String
s e Symbol
s per esempio) e si otterrà un messaggio di errore come confronto di Symbol with String failed (ArgumentError). In tal caso, è possibile modificare quanto sopra a
temp = Hash[ temp.sort_by { |key, val| key.to_s } ]
per risolvere il problema. Tuttavia, tieni presente che le chiavi manterranno comunque i loro tipi originali che potrebbero causare problemi con ipotesi nel codice successivo. Inoltre, la maggior parte delle classi incorporate supporta un metodo .to_s
, pertanto è possibile ottenere risultati indesiderati (ad esempio un ordinamento imprevisto per chiavi numeriche o altri tipi imprevisti).
Si potrebbe, oltre, convertire le chiavi per Strings
con qualcosa di simile:
temp = Hash[ temp.map { |key, val| [key.to_s, val] }.sort ]
. . . sebbene questo approccio perderebbe informazioni sul tipo della chiave originale rendendo impossibile ricondurre i dati originali in modo affidabile.
fonte
2014-12-09 17:27:14
Il codice sembra di fare ciò che avete richiesto. Vuoi modificare la domanda per includere l'output che ti aspetti? –
Ho assunto il presupposto che vuoi che il tuo output sia un altro hash. Sarebbe bello vederlo nella domanda in tal caso (quindi la domanda e la risposta corrisponderebbero). –
Cosa vuoi come output? Gli hash non sono realmente ordinati (sono, per ordine di inserimento, a partire da Ruby 1.9+). Cosa stai cercando di fare in particolare? –