Come trovare la chiave dell'hash di valore più grande?


110

Ho il seguente hash {"CA"=>2, "MI"=>1, "NY"=>1}

Come posso restituire la coppia di valori chiave massima utilizzando ruby? Vorrei che restituisse "CA"


3
Cosa succede se ci sono più chiavi con lo stesso valore più grande?
Gabe

Risposte:


230

Questo restituirà la coppia chiave-valore hash max a seconda del valore degli elementi hash:

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end

49
vale la pena notare che si ottiene un array di 2 elementi con [chiave, valore]
justingordon

6
hash.max_by {| k, v | v} [0] fornisce la chiave.
nfriend21

4
Vale anche la pena notare che un pareggio andrà al primo posto in ordine di posizione.
Robbie Guilfoyle

8
Puoi anche fare hash.max_by (&: last) per la coppia e hash.max_by (&: last) .first per la chiave.
mahemoff

38

Ho trovato in questo modo, restituire la chiave del primo valore massimo

hash.key(hash.values.max)

16

Un altro modo potrebbe essere il seguente:

hash.each { |k, v| puts k if v == hash.values.max }

Questo attraversa ogni coppia chiave-valore e restituisce (o in questo caso inserisce) le chiavi in ​​cui il valore è uguale al massimo di tutti i valori. Questo dovrebbe restituire più di una chiave se c'è un pareggio.


5

È possibile utilizzare il metodo di selezione se si desidera restituire la coppia chiave-valore:

hash.select {|k,v| v == hash.values.max }

4

Se si desidera recuperare più di una coppia di valori chiave in base all'ordine (la seconda più grande, la più piccola ecc.), Un modo più efficiente sarà ordinare l'hash una volta e quindi ottenere i risultati desiderati.

def descend_sort(hash)
   hash = hash.sort_by {|k,v| v}.reverse
end

Chiave di maggior valore

puts *hash[0][0]

Ottieni max e min

puts *hash[0], *hash[hash.length-1]

Seconda coppia chiave-valore più grande

Hash[*hash[1]]

Per riconvertire l'array hash in un hash

hash.to_h

1

L'ho fatto oggi su un problema simile e ho finito con questo:

hash = { "CA"=>2, "MI"=>1, "NY"=>1 }

hash.invert.max&.last
=> "CA" 

Per Ruby inferiore a 2.3 puoi sostituire &.lastcon .try(:last) O uno è solo una salvaguardia se il tuo hash sorgente è vuoto:{}


-3

Questo restituirà l'ultima chiave dell'hash ordinata per dimensione; tuttavia, potrebbero esserci due chiavi con lo stesso valore.

def largest_hash_key(hash)
  key = hash.sort{|a,b| a[1] <=> b[1]}.last
  puts key
end

hash = { "n" => 100, "m" => 100, "y" => 300, "d" => 200, "a" => 0 }
largest_hash_key(hash)

2
risposta selezionata? may_by è molto meglio di un ordinamento di basso livello. È più compatto e utilizza meno memoria di un sort + last.
Tokland
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.