2012-06-19 134 views
1

我想根據它的值爲其中的每個鍵確定一個哈希值。該值是數字。排名可以重複(即3個鍵可以與第一名並列)。這有用,但很醜。基於值的排序哈希鍵

standings.sort_by {|k, v| v}.reverse! 
prev_k = nil 
standings.each_with_index do |(k, v), i| 
    if i == 0 
    k.rank = 1 
    elsif v == standings[prev_k] 
    k.rank = prev_k.rank 
    else 
    k.rank = prev_k.rank + 1 
    end 
    prev_k = k 
end 
+0

請發佈輸入和期望的輸出數據的例子。 – Anil

回答

0

試試這個:

ranks = Hash[standings.values.sort.uniq.reverse.each_with_index.to_a] 
standings.each { |k, v| k.rank = ranks[v] + 1 } 

我不知道這是任何漂亮,但它是一個有點更緊湊,攜帶較少的循環變量,並且沒有條件語句。

+0

很好用 - 謝謝!無論哪種方式,我可能需要重新構造初始散列,以便可以更優雅地完成此操作。 – steakchaser