Ruby中如何用单个整数匹配哈希范围键并获取对应值
如何匹配整数对应的范围键哈希值
你可以利用Ruby的Enumerable#bsearch方法来实现,它是二分查找,比线性遍历(each/map)效率更高,而且属于内置方法,符合你的需求:
hash = { 0..25 => { low_battery_count: 13 }, 26..75 => { average_battery_count: 4 }, 76..100 => { good_battery_count: 4 } } def battery_info(hash, num) # 二分查找找到包含num的范围键 matching_range = hash.keys.bsearch { |range| range.include?(num) } hash[matching_range] end # 测试示例 battery_info(hash, 3) # => {:low_battery_count=>13} battery_info(hash, 35) # => {:average_battery_count=>4} battery_info(hash, 90) # => {:good_battery_count=>4}
为什么用bsearch?
因为你的哈希键是有序且不重叠的连续范围,二分查找的时间复杂度是O(log n),远优于线性遍历的O(n),尤其是当范围数量增多时,优势会更明显。
静态场景的简化写法
如果你的范围是固定不变的,也可以用case语句直接匹配,代码更直观:
def battery_info(num) case num when 0..25 then { low_battery_count: 13 } when 26..75 then { average_battery_count: 4 } when 76..100 then { good_battery_count: 4 } end end
但如果哈希是动态生成的(比如范围或对应值会变化),还是基于哈希的bsearch方法更灵活。
内容的提问来源于stack exchange,提问作者Mohsin Nazakat
相关产品推荐
相关产品推荐

