2015-05-21 18 views
5

Ho un hash come questoOrdina un hash per valore in ordine e poi il tasto decrescente in ordine crescente rubino

trial_hash ={"key1"=>1000, "key2"=>34, "key3"=>500, "key4"=>500, "key5"=>500, "key6"=>500} 

lo ordino in ordine di valore decrescente:

my_hash = trial_hash.sort_by{|k, v| v}.reverse 

ottengo in questo modo:

[["key1", 1000], ["key4", 500], ["key5", 500], ["key6", 500], ["key3", 500], ["key2", 34]] 

Ma voglio che sia ordinato in ordine crescente di chiave quando il valore è lo stesso. Come lo faccio?

Per esempio: I hash sarebbe ordinato questo modo:

[["key1", 1000], ["key3", 500], ["key4", 500], ["key5", 500], ["key6", 500], ["key2", 34]] 

risposta

8

In confronto, gli array ottenere elaborato prima dai primi elementi, poi il secondo, ecc È possibile utilizzare questo fatto per enumerare confronti sequenziali. Confronto con [-v, k] primo ordinamento per valore (in ordine inverso) quindi per tasto.

>> trial_hash.sort_by{|k, v| [-v, k]} 
=> [["key1", 1000], ["key3", 500], ["key4", 500], ["key5", 500], ["key6", 500], ["key2", 34]] 
+0

cool .. grazie! Ho provato questo trial_hash.sort_by {| k, v | [v, -Integer (k)]}. reverse ma la chiave non era una stringa, quindi non ha funzionato, ho fatto in modo che la chiave 1 invece di key1 funzionasse. ma il tuo nuovo codice è fantastico. – inquisitive

Problemi correlati