2010-11-24 77 views
56

散列值降序排序我輸入哈希:h = { "a" => 20, "b" => 30, "c" => 10 }由紅寶石

升序排序:h.sort {|a,b| a[1]<=>b[1]} #=> [["c", 10], ["a", 20], ["b", 30]]

但是,我需要[["b", 30], ["a", 20], ["c", 10]]

如何才能使它工作周圍的其他方法, <=>是什麼意思?

回答

151

你可以讓它更清潔,更清晰,更快!就像這樣:

h.sort_by {|k,v| v}.reverse 

我基準定時分揀與隨機值1000元哈希的3000次迭代,並得到了這些時間:

h.sort {|x,y| -(x[1]<=>y[1])} -- 16.7s 
h.sort {|x,y| y[1] <=> x[1]} -- 12.3s 
h.sort_by {|k,v| -v} -- 5.9s 
h.sort_by {|k,v| v}.reverse -- 3.7 
8

<=>比較兩個操作數,如果第一個操作數較低則返回-1,如果它們相等則返回0,如果第一個較高則返回1。這意味着您只需執行-(a[1]<=>b[1])即可撤消訂單。

+1

我總是喜歡看它與「a」和「b」元素交換,而不是否定結果。與他們交換,我只需要看看他們的順序,看他們倒退知道這是顛倒過來。當「<=>」的值被否定時,我仍然需要查看實際比較以瞭解發生了什麼。這是一個小問題,但我知道的是因爲我可以感覺到我的大腦在做了「什麼!?」之後必須做第二次檢查。 – 2010-11-24 17:16:42

+1

@Greg:我明白你爲什麼更喜歡這種方式。我恰恰相反:在我的掃描眼中,`b [1] <=> a [1]`看起來像`a [1] <=> b [1]`,我覺得需要停下來檢查,而否定使得它很明顯,我們正在做一個反向排序。 – Chuck 2010-11-24 20:40:03

+0

我也明白你的觀點。無論採用哪種方式,都需要仔細審視所比較的值。也許我們需要一個不同的操作符 - `> = <`用於反序?不,那會很糟糕。這是整個結構,但我更喜歡`<=>`而不是更詳細的方法,我們必須調用某些方法名稱。 – 2010-11-24 21:49:47

10
h.sort {|a,b| b[1]<=>a[1]} 
5

超級簡單:h.sort_by { |k, v| -v }