En büyük değer karmasının anahtarı nasıl bulunur?


110

Aşağıdaki hash'e sahibim {"CA"=>2, "MI"=>1, "NY"=>1}

Ruby kullanarak maksimum anahtar değer çiftini nasıl iade edebilirim? "CA" döndürmesini istiyorum


3
Ya aynı en büyük değere sahip birden çok anahtar varsa?
Gabe

Yanıtlar:


230

Bu, karma öğelerin değerine bağlı olarak maksimum karma anahtar / değer çifti döndürür:

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

49
[anahtar, değer] ile 2 öğeli bir diziyi geri aldığınızı belirtmek gerekir
justingordon

6
hash.max_by {| k, v | v} [0] anahtarı verir.
nfriend21

4
Ayrıca, bir beraberliğin pozisyon sırasına göre ilk sıraya gideceğini belirtmek gerekir.
Robbie Guilfoyle

8
Ayrıca, çift için hash.max_by (&: last) ve anahtar için hash.max_by (&: last) .first yapabilirsiniz.
mahemoff

38

Bu şekilde buldum, ilk maksimum değerin anahtarını döndür

hash.key(hash.values.max)

16

Başka bir yol aşağıdaki gibi olabilir:

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

Bu, her bir anahtar / değer çifti üzerinden geçer ve değerin tüm değerlerin maksimumuna eşit olduğu anahtarları döndürür (veya bu durumda koyar). Beraberlik varsa bu birden fazla anahtar döndürmelidir.


5

Anahtar değer çiftinin döndürülmesini istiyorsanız, seçme yöntemini kullanabilirsiniz:

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

4

Sıraya göre (ikinci en büyük, en küçük vb.) Birden fazla anahtar değer çifti almak istiyorsanız, daha etkili bir yol, karmayı bir kez sıralamak ve ardından istenen sonuçları elde etmek olacaktır.

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

En büyük değerin anahtarı

puts *hash[0][0]

Max ve min alın

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

2. en büyük anahtar değer çifti

Hash[*hash[1]]

Hash dizisini hash'e geri dönüştürmek için

hash.to_h

1

Bunu bugün benzer bir problemde yaptım ve şununla sonuçlandı:

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

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

2,3'ten az Ruby için &.last, .try(:last) ikisinden biri, kaynak karma değerinizin boş olması durumunda yalnızca bir korumadır:{}


-3

Bu, hash'in boyuta göre sıralanmış son anahtarını döndürür; ancak aynı değere sahip iki anahtar olabilir.

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
seçili cevap? may_by, düşük seviyeli bir sıralamadan çok daha iyidir. Daha kompakttır ve sıralama + sondan daha az bellek kullanır.
tokland
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.