Wie finde ich den Schlüssel des Hash mit dem größten Wert?

110

Ich habe den folgenden Hash {"CA"=>2, "MI"=>1, "NY"=>1}

Wie kann ich das maximale Schlüsselwertpaar mit Ruby zurückgeben? Ich möchte, dass "CA" zurückgegeben wird.

JZ.
quelle
3
Was ist, wenn mehrere Schlüssel mit demselben größten Wert vorhanden sind?
Gabe

Antworten:

230

Dies gibt je nach Wert der Hash-Elemente ein maximales Hash-Schlüssel-Wert-Paar zurück:

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end
Hck
quelle
49
Erwähnenswert ist, dass Sie ein Array mit 2 Elementen mit [Schlüssel, Wert]
zurückerhalten
6
hash.max_by {| k, v | v} [0] gibt den Schlüssel an.
nfriend21
4
Erwähnenswert ist auch, dass ein Unentschieden in der Reihenfolge seiner Position an erster Stelle steht.
Robbie Guilfoyle
8
Sie können auch hash.max_by (&: last) für das Paar und hash.max_by (&: last) .first für den Schlüssel ausführen.
Mahemoff
38

Ich habe auf diese Weise den Schlüssel des ersten Maximalwerts zurückgegeben

hash.key(hash.values.max)
Tiberiu Macelaru
quelle
16

Ein anderer Weg könnte wie folgt sein:

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

Dies durchläuft jedes Schlüssel-Wert-Paar und gibt die Schlüssel zurück (oder setzt sie in diesem Fall), wobei der Wert gleich dem Maximum aller Werte ist. Dies sollte mehr als einen Schlüssel zurückgeben, wenn es ein Unentschieden gibt.

K. George Pradhan
quelle
5

Sie können die select-Methode verwenden, wenn das Schlüsselwertpaar zurückgegeben werden soll:

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

Wenn Sie mehr als ein Schlüsselwertpaar basierend auf der Reihenfolge (zweitgrößte, kleinste usw.) abrufen möchten, ist es effizienter, den Hash einmal zu sortieren und dann die gewünschten Ergebnisse zu erhalten.

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

Schlüssel mit dem größten Wert

puts *hash[0][0]

Holen Sie sich max und min

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

Zweitgrößtes Schlüsselwertpaar

Hash[*hash[1]]

So konvertieren Sie das Hash-Array wieder in einen Hash

hash.to_h
Linju
quelle
1

Ich habe dies heute bei einem ähnlichen Problem getan und bin zu folgendem Ergebnis gekommen:

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

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

Ruby weniger als 2,3 können Sie ersetzen &.lastmit .try(:last) Entweder man ist nur ein Schutz für die, wenn Ihre Quelle Hash leer ist :{}

JP Duffy
quelle
-3

Dies gibt den letzten Schlüssel des Hashs zurück, sortiert nach Größe. Möglicherweise gibt es jedoch zwei Schlüssel mit demselben Wert.

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)
thenengah
quelle
2
ausgewählte Antwort? may_by ist viel besser als eine Sortierung auf niedriger Ebene. Es ist kompakter und benötigt weniger Speicher als eine Sortierung + Leiste.
Tokland