Jak znaleźć klucz o największej wartości skrótu?

110

Mam następujący hash {"CA"=>2, "MI"=>1, "NY"=>1}

Jak mogę zwrócić maksymalną parę klucz-wartość za pomocą ruby? Chciałbym, żeby zwróciło „CA”

J Z.
źródło
3
Co się stanie, jeśli istnieje wiele kluczy o tej samej największej wartości?
Gabe

Odpowiedzi:

230

To zwróci max hash para klucz-wartość w zależności od wartości elementów hash:

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end
Hck
źródło
49
warto zauważyć, że otrzymujesz 2-elementową tablicę z [klucz, wartość]
justingordon
6
hash.max_by {| k, v | v} [0] podaje klucz.
nfriend21
4
Warto również zauważyć, że remis przejdzie do pierwszego w kolejności pozycji.
Robbie Guilfoyle
8
Możesz również wykonać hash.max_by (&: last) dla pary i hash.max_by (&: last) .first dla klucza.
mahemoff
38

Znalazłem w ten sposób, zwróć klucz pierwszej wartości maksymalnej

hash.key(hash.values.max)
Tiberiu Macelaru
źródło
16

Innym sposobem może być:

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

Sprawdza każdą parę klucz-wartość i zwraca (lub w tym przypadku umieszcza) klucze, w których wartość jest równa maksymalnej ze wszystkich wartości. To powinno zwrócić więcej niż jeden klucz, jeśli jest remis.

K. George Pradhan
źródło
5

Możesz użyć metody select, jeśli chcesz, aby para klucz-wartość została zwrócona:

hash.select {|k,v| v == hash.values.max }
ekodowanie5
źródło
4

Jeśli chcesz pobrać więcej niż jedną parę klucz-wartość na podstawie kolejności (druga co do wielkości, najmniejsza itp.), Bardziej wydajnym sposobem będzie jednokrotne posortowanie skrótu, a następnie uzyskanie pożądanych wyników.

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

Klucz o największej wartości

puts *hash[0][0]

Uzyskaj maks. I min

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

Druga co do wielkości para klucz-wartość

Hash[*hash[1]]

Aby przekonwertować tablicę skrótów z powrotem na skrót

hash.to_h
Linju
źródło
1

Zrobiłem to dzisiaj z podobnym problemem i skończyło się na tym:

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

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

W przypadku Rubiego mniejszego niż 2.3 możesz zamienić na Którykolwiek &.lastz .try(:last)nich jest tylko zabezpieczeniem, jeśli twój kod źródłowy jest pusty:{}

JP Duffy
źródło
-3

To zwróci ostatni klucz skrótu posortowany według rozmiaru; jednak mogą istnieć dwa klucze o tej samej wartości.

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
źródło
2
wybrana odpowiedź? may_by jest znacznie lepsze niż sortowanie niskiego poziomu. Jest bardziej kompaktowy i zużywa mniej pamięci niż sort + ostatni.
tokland