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”


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

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


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.


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 }

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

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:{}


-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)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.