散列值降序排序我輸入哈希: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]]
如何才能使它工作周圍的其他方法, <=>
是什麼意思?
散列值降序排序我輸入哈希: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]]
如何才能使它工作周圍的其他方法, <=>
是什麼意思?
你可以讓它更清潔,更清晰,更快!就像這樣:
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
<=>
比較兩個操作數,如果第一個操作數較低則返回-1,如果它們相等則返回0,如果第一個較高則返回1。這意味着您只需執行-(a[1]<=>b[1])
即可撤消訂單。
h.sort {|a,b| b[1]<=>a[1]}
超級簡單:h.sort_by { |k, v| -v }
我總是喜歡看它與「a」和「b」元素交換,而不是否定結果。與他們交換,我只需要看看他們的順序,看他們倒退知道這是顛倒過來。當「<=>」的值被否定時,我仍然需要查看實際比較以瞭解發生了什麼。這是一個小問題,但我知道的是因爲我可以感覺到我的大腦在做了「什麼!?」之後必須做第二次檢查。 – 2010-11-24 17:16:42
@Greg:我明白你爲什麼更喜歡這種方式。我恰恰相反:在我的掃描眼中,`b [1] <=> a [1]`看起來像`a [1] <=> b [1]`,我覺得需要停下來檢查,而否定使得它很明顯,我們正在做一個反向排序。 – Chuck 2010-11-24 20:40:03
我也明白你的觀點。無論採用哪種方式,都需要仔細審視所比較的值。也許我們需要一個不同的操作符 - `> = <`用於反序?不,那會很糟糕。這是整個結構,但我更喜歡`<=>`而不是更詳細的方法,我們必須調用某些方法名稱。 – 2010-11-24 21:49:47