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"


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

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)

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.


5

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

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

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

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


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.