2012-10-22 38 views
6

Tôi có một băm và tôi muốn trả lại (các) khóa (hoặc cặp khóa/giá trị) của giá trị lớn nhất (s) của băm. Vì vậy, nếu chỉ có một giá trị thực, nó sẽ trả về một khóa; tuy nhiên, nếu có nhiều cặp khóa/giá trị có cùng giá trị, nó sẽ trả về tất cả các khóa này. Làm thế nào tôi có thể thực hiện điều này trong Ruby?Ruby - tìm (các) khoá có giá trị lớn nhất của một băm

my_hash.max_by {|k,v| v} #only returns one key/value pair 
+0

tôi đoán cùng một câu hỏi của mình đã trả lời ở đây http://stackoverflow.com/questions/6040494/how-to-find-the-key-of-the-lớn nhất-giá trị-băm –

+0

Bạn đang lưu trữ loại giá trị nào trong mã băm của mình? Bạn chỉ xử lý các số nguyên? –

+0

@yasirhashmi có, ngoại trừ tôi không muốn trả lại chỉ một, tôi muốn trả lại nhiều cặp k/v nếu chúng có cùng giá trị. – diasks2

Trả lời

11

Nếu bạn muốn tất cả các cặp, tôi sẽ làm một cái gì đó giống như

max = my_hash.values.max 
Hash[my_hash.select { |k, v| v == max}] 
+1

Tại sao ===? Tôi nghĩ rằng có thể không làm những gì bạn nghĩ rằng nó. – pguardiario

+1

@pguardiario là một thói quen xấu. Tôi đã xóa nó, cảm ơn bạn. – oldergod

2

Một lót duy nhất:

my_hash.reduce({}){|h,(k,v)| (h[v] ||= []) << k;h}.max 

irb 
> z = {:tree => 3, :two => 2, 'three' => 3} 

> z.reduce({}){|h,(k,v)| (h[v] ||= []) << k;h}.max 
[3, [:tree, "three"]] 
Các vấn đề liên quan