Làm thế nào để tìm khóa của giá trị lớn nhất băm?


110

Tôi có băm sau {"CA"=>2, "MI"=>1, "NY"=>1}

Làm cách nào để trả lại cặp giá trị khóa tối đa bằng ruby? Tôi muốn nó trả về "CA"


3
Điều gì sẽ xảy ra nếu có nhiều khóa có cùng giá trị lớn nhất?
Gabe

Câu trả lời:


230

Điều này sẽ trả về cặp khóa-giá trị băm tối đa tùy thuộc vào giá trị của các phần tử băm:

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

49
Đáng chú ý bạn lấy lại một mảng 2 phần tử với [key, value]
justingordon

6
hash.max_by {| k, v | v} [0] đưa ra khóa.
nfriend21

4
Cũng cần lưu ý rằng một hòa sẽ đi đầu tiên theo thứ tự vị trí.
Robbie Guilfoyle

8
Bạn cũng có thể thực hiện hash.max_by (&: last) cho cặp và hash.max_by (&: last). Đầu tiên cho khóa.
mahemoff

38

Tôi đã tìm thấy theo cách này, trả về khóa của giá trị tối đa đầu tiên

hash.key(hash.values.max)

16

Một cách khác có thể như sau:

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

Thao tác này chạy qua từng cặp khóa-giá trị và trả về (hoặc trong trường hợp này là đặt) (các) khóa trong đó giá trị bằng giá trị lớn nhất của tất cả các giá trị. Điều này sẽ trả về nhiều hơn một khóa nếu có sự ràng buộc.


5

Bạn có thể sử dụng phương pháp select nếu bạn muốn trả về cặp giá trị khóa:

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

4

Nếu bạn muốn truy xuất nhiều hơn một cặp giá trị khóa dựa trên thứ tự (lớn nhất thứ hai, nhỏ nhất, v.v.), một cách hiệu quả hơn sẽ là sắp xếp hàm băm một lần và sau đó nhận được kết quả mong muốn.

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

Khóa có giá trị lớn nhất

puts *hash[0][0]

Nhận tối đa và tối thiểu

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

Cặp giá trị khóa lớn thứ 2

Hash[*hash[1]]

Để chuyển đổi mảng băm trở lại thành một băm

hash.to_h

1

Tôi đã làm điều này hôm nay về một vấn đề tương tự và kết thúc với điều này:

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

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

Đối với Ruby nhỏ hơn 2.3, bạn có thể thay thế &.lastbằng .try(:last) Một trong hai chỉ là biện pháp bảo vệ nếu mã băm nguồn của bạn trống:{}


-3

Thao tác này sẽ trả về khóa cuối cùng của hàm băm được sắp xếp theo kích thước; tuy nhiên, có thể có hai khóa có cùng giá trị.

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
câu trả lời đã chọn? may_by tốt hơn nhiều so với sắp xếp cấp thấp. Nó nhỏ gọn hơn và sử dụng ít bộ nhớ hơn so với sắp xếp + cuối cùng.
tokland
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.