Bagaimana cara menemukan kunci hash nilai terbesar?

110

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

Bagaimana cara mengembalikan pasangan nilai kunci maksimum menggunakan ruby? Saya ingin mengembalikan "CA"

JZ.
sumber
3
Bagaimana jika ada beberapa kunci dengan nilai terbesar yang sama?
Gabe

Jawaban:

230

Ini akan mengembalikan pasangan nilai kunci hash tergantung pada nilai elemen hash:

def largest_hash_key(hash)
  hash.max_by{|k,v| v}
end
Hck
sumber
49
perlu dicatat Anda mendapatkan kembali array 2 elemen dengan [key, value]
justingordon
6
hash.max_by {| k, v | v} [0] memberikan kuncinya.
nfriend21
4
Juga perlu diperhatikan bahwa seri akan menjadi yang pertama dalam urutan posisi.
Robbie Guilfoyle
8
Anda juga dapat melakukan hash.max_by (&: terakhir) untuk pasangan dan hash.max_by (&: terakhir). Pertama untuk kunci.
mahemoff
38

Saya menemukan cara ini, kembalikan kunci dari nilai maks pertama

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

Cara lain bisa jadi sebagai berikut:

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

Ini berjalan melalui setiap pasangan nilai kunci dan mengembalikan (atau dalam kasus ini menempatkan) kunci di mana nilainya sama dengan maks dari semua nilai. Ini harus mengembalikan lebih dari satu kunci jika ada seri.

K. George Pradhan
sumber
5

Anda dapat menggunakan metode pilih jika Anda ingin pasangan nilai kunci dikembalikan:

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

Jika Anda ingin mengambil lebih dari satu pasangan nilai kunci berdasarkan urutan (terbesar kedua, terkecil, dll.), Cara yang lebih efisien adalah dengan mengurutkan hash satu kali dan kemudian mendapatkan hasil yang diinginkan.

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

Kunci dengan nilai terbesar

puts *hash[0][0]

Dapatkan maks dan min

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

Pasangan nilai kunci terbesar ke-2

Hash[*hash[1]]

Untuk mengubah array hash kembali menjadi hash

hash.to_h
Linju
sumber
1

Saya melakukan ini hari ini pada masalah yang sama dan berakhir dengan ini:

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

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

Untuk Ruby yang kurang dari 2.3 Anda dapat menggantinya &.lastdengan .try(:last) Salah satu yang hanya sebagai pengaman jika hash sumber Anda kosong:{}

JP Duffy
sumber
-3

Ini akan mengembalikan kunci terakhir dari hash yang diurutkan berdasarkan ukuran; Namun, mungkin ada dua kunci dengan nilai yang sama.

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
sumber
2
jawaban yang dipilih? may_by jauh lebih baik daripada pengurutan tingkat rendah. Ini lebih kompak dan menggunakan lebih sedikit memori daripada semacam + terakhir.
tokland