จะค้นหาคีย์ของแฮชที่มีมูลค่ามากที่สุดได้อย่างไร


110

ฉันมีแฮชดังต่อไปนี้ {"CA"=>2, "MI"=>1, "NY"=>1}

ฉันจะคืนคู่ค่าคีย์สูงสุดโดยใช้ทับทิมได้อย่างไร ฉันต้องการให้ส่งคืน "CA"


3
จะเกิดอะไรขึ้นถ้ามีหลายคีย์ที่มีค่ามากที่สุดเท่ากัน?
Gabe

คำตอบ:


230

สิ่งนี้จะส่งคืนคู่คีย์ - ค่าแฮชสูงสุดโดยขึ้นอยู่กับค่าขององค์ประกอบแฮช:

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

49
ที่น่าสังเกตว่าคุณได้รับอาร์เรย์ 2 องค์ประกอบกลับมาพร้อมกับ [คีย์, ค่า]
justingordon

6
hash.max_by {| k, v | v} [0] ให้คีย์
nfriend21

4
นอกจากนี้ควรสังเกตว่าการเสมอกันจะขึ้นอันดับหนึ่งตามลำดับ
Robbie Guilfoyle

8
คุณยังสามารถทำ hash.max_by (&: last) สำหรับคู่และ hash.max_by (&: last) อันดับแรกสำหรับคีย์
mahemoff


16

อีกวิธีหนึ่งอาจเป็นดังนี้:

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

สิ่งนี้จะทำงานผ่านคู่คีย์ - ค่าแต่ละคู่และส่งกลับ (หรือในกรณีนี้ทำให้เป็น) คีย์โดยที่ค่าเท่ากับค่าสูงสุดของค่าทั้งหมด สิ่งนี้ควรส่งคืนมากกว่าหนึ่งคีย์หากมีการเสมอกัน



4

หากคุณต้องการดึงข้อมูลคู่ค่าคีย์มากกว่าหนึ่งคู่ตามลำดับ (ใหญ่เป็นอันดับสองเล็กที่สุดเป็นต้น) วิธีที่มีประสิทธิภาพมากขึ้นคือการจัดเรียงแฮชเพียงครั้งเดียวจากนั้นให้ได้ผลลัพธ์ที่ต้องการ

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

คีย์ของค่าที่มากที่สุด

puts *hash[0][0]

รับสูงสุดและต่ำสุด

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

คู่ค่าคีย์ที่ใหญ่เป็นอันดับ 2

Hash[*hash[1]]

ในการแปลงแฮชอาร์เรย์กลับเป็นแฮช

hash.to_h

1

วันนี้ฉันทำสิ่งนี้กับปัญหาที่คล้ายกันและลงเอยด้วยสิ่งนี้:

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

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

สำหรับ Ruby ที่น้อยกว่า 2.3 คุณสามารถแทนที่&.lastด้วย.try(:last) อย่างใดอย่างหนึ่งเป็นเพียงตัวป้องกันหากแฮชต้นทางของคุณว่างเปล่า:{}


-3

สิ่งนี้จะส่งคืนคีย์สุดท้ายของแฮชที่จัดเรียงตามขนาด อย่างไรก็ตามอาจมีสองคีย์ที่มีค่าเดียวกัน

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
คำตอบที่เลือก? may_by ดีกว่าการเรียงลำดับระดับต่ำมาก มีขนาดกะทัดรัดกว่าและใช้หน่วยความจำน้อยกว่า sort + last
tokland
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.