2012-10-22 17 views
6

Ho un hash e voglio restituire la (e) chiave (o coppia chiave/valore/i) del valore massimo (s) dell'hash. Quindi, se c'è un solo massimo vero, restituirà quell'unica chiave; tuttavia, se ci sono più coppie chiave/valore con lo stesso valore, restituirà tutte queste chiavi. Come posso realizzare questo in Ruby?Ruby - trova la/le chiave/i del/i valore/i maggiore/i di un hash

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

presumo che sia la stessa domanda ha risposto qui http://stackoverflow.com/questions/6040494/how-to-find-the-key-of-the-hash-value-hash –

+0

Che tipo di valori stai memorizzando nel tuo hash? Hai a che fare solo con numeri interi? –

+0

@yasirhashmi si, lo stesso eccetto che non voglio restituire solo uno, voglio restituire più coppie k/v se hanno lo stesso valore. – diasks2

risposta

11

Se volete tutte le coppie, vorrei fare qualcosa di simile

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

Perché ===? Penso che potrebbe non fare quello che pensi che faccia. – pguardiario

+1

@pguardiario una brutta abitudine. L'ho rimosso, grazie. – oldergod

2

Una sola nave di linea:

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