2012-10-22 36 views
6

我有一个散列,我想返回最大值(或键/值对)的密钥(s)(或键/值对) s)的散列。所以,如果只有一个真正的最大值,它将返回一个密钥;但是,如果有多个具有相同值的键/值对,它将返回所有这些键。我怎样才能在Ruby中完成这项工作?红宝石 - 找到散列最大值的密钥

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

我猜想它同样的问题回答这里http://stackoverflow.com/questions/6040494 /如何找到最大值的哈希键 –

+0

您在哈希中存储什么样的值?你只处理整数? –

+0

@yasirhashmi是的,除了我不想只返回一个,我想要返回多个k/v对,如果他们有相同的值。 – diasks2

回答

11

如果你希望所有的对,我会做类似

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

为什么===?我认为这可能不会做你认为的事。 – pguardiario

+1

@pguardiario一个坏习惯。我删除了它,谢谢。 – oldergod

2

单衬:

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"]]