我在 Ruby 中有這個哈希:
hash = {
0..25 => { low_battery_count: 13 },
26..75 => { average_battery_count: 4 },
76..100 => { good_battery_count: 4 }
}
現在,需要的是一種方法(最好是內置方法),如果我傳遞一個值(整數,例如 20、30 等),它應該回傳該整數所在范圍內的值。
我已經使用每種方法解決了它,但現在,我想優化它,甚至更多,不使用每種方法或映射方法來降低其復雜性。
例如:
method(3) #=> {:low_battery_count=>13}
method(35) #=> {:average_battery_count=>4}
method(90) #=> {:good_battery_count=>4}
uj5u.com熱心網友回復:
您可以使用find此哈希
BATTERIES = {
0..25 => { low_battery_count: 13 },
26..75 => { average_battery_count: 4 },
76..100 => { good_battery_count: 4 }
}
def get_batteries_count(value)
BATTERIES.find { |range, _| range.include?(value) }&.last
end
get_batteries_count(3) #=> {:low_battery_count=>13}
get_batteries_count(35) #=> {:average_battery_count=>4}
get_batteries_count(90) #=> {:good_battery_count=>4}
get_batteries_count(2000) #=> nil
uj5u.com熱心網友回復:
您需要獲取確切的鍵才能從哈希中獲取值。因此,無論哪種方式,都應該針對可用的鍵(范圍)測驗通過的數字。
您可能會考慮引入基于為常量分配預定范圍并使用大小寫相等檢查的優化:
SMALL = 0..25
MEDUIM = 26..75
LARGE = 76..100
def method(n)
case n
when SMALL then data[SMALL]
when MEDUIM then data[MEDUIM]
when LARGE then data[LARGE]
end
end
def data
@data ||= {
SMALL => { low_battery_count: 13 },
MEDUIM => { average_battery_count: 4 },
LARGE =>{ good_battery_count: 4 }
}
end
method(25)
=> {:low_battery_count=>13}
method(44)
=> {:average_battery_count=>4}
method(76)
=> {:good_battery_count=>4}
uj5u.com熱心網友回復:
我們可以使用一些內置方法來做到這一點,但沒有任何直接的方法可以做到這一點
class Hash
def value_at_key_range(range_member)
keys.select{ |range| range.include?(range_member) }.map{ |key| self[key]}
end
end
hash = {0..25=>{:low_battery_count=>13}, 26..75=>{:average_battery_count=>4}, 76..100=>{:good_battery_count=>4}}
p hash.value_at_key_range(10)
輸出
[{:low_battery_count=>13}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/511826.html
