2012-08-15 10 views
3

所以我有一個哈希:{"spider" => 213, "frog" => 128, "apple" => 812}如何通過紅寶石中的數值來排序哈希值? (不轉換爲陣列)

我該如何重新排序,以便按降序對它們進行排序而不將其轉換爲數組?因此,將其更改爲{"apple" => 812, "spider" => 213, "frog" => 128}而不將它變成數組。我試過.sort_by,但是它將它轉換爲一個數組。

+5

你不能。哈希不保留排序順序。 – meagar 2012-08-15 18:27:11

+4

他們這樣做。 Ruby中的哈希現在是有序結構,從1.9.3開始。 – 2012-08-15 18:37:01

+1

@BorisStitnicky但只有鍵的順序。 – 2012-08-15 18:39:09

回答

5

在Ruby 1.9,「Hashes enumerate their values in the order that the corresponding keys were inserted」,所以只要確保你以正確的方式將它們插入:

Hash[h.sort_by { |_, v| -v }] 
#=> > {"apple"=>812, "spider"=>213, "frog"=>128} 
+0

哦,那麼Matz以前說過的話是不是真的了?我們是否有散列方法? – 2012-08-15 18:40:09

+2

'sort_by'來自'Enumerable','Hash's包含mixin。這基本上做了散列 - >數組 - >散列,確保按照正確的順序插入鍵。 – 2012-08-15 18:42:19

+0

你是對的,有一個!直到它返回一對數組,這就是提問者不想要的東西^ _^ – 2012-08-15 18:42:51

-1

所以,問題不無關係。但爲什麼?重新排序是什麼意思?到位重新排序?不管你做什麼,你都必須以某種方式提取散列值。你爲什麼害怕陣列?你知道小哈希現在在Ruby中作爲數組實現嗎? (或將要在2.0?)馬茨從加入排序方法哈希故意忍住了,我看他對這個話題的帖子...

+0

你究竟如何將非數字鍵的散列實現爲數組?你有沒有參考那部分?我可以想像其他方式,比如Lua ...... – 2012-08-15 18:40:57

+0

嗯,我不知道怎麼做,但我沒有做出來 - 我認真地讀了它。 – 2012-08-15 18:45:18

+0

我很想看到關於這個的原始Matz評論。 – 2012-08-15 19:12:53

2

你需要排序的哈希值本身,或者只是其在排序操作的內容訂購?如果是後者,那麼這個代碼段將工作:

myhash.keys.sort.each { |k| .... do something with myhash[k] .... } 

的唯一方法我可以看到,除了簡單地填充以排序的順序來啓動與所述散列值,是使用一箇中間陣列:

Hash[myhash.sort] 

但是,作爲程序員,你不會「看到」中間狀態。在散列上使用排序方法將散列轉換爲有序數組,並且#[]方法將數組強制轉換爲散列。至少在Ruby-1.9.3上。

+0

唯一的方法是從數組中刪除鍵並使用#merge將它們附加到它。但是從一開始就不需要使用陣列的要求很弱。 – 2012-08-15 21:59:08