Câu trả lời:
Đ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
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)
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.
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
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ế &.last
bằ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:{}
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)