使用散列中的单个整数进行搜索,其键是 Ruby 中的范围

问题描述 投票:0回答:3

我在 Ruby 中有这个哈希:

hash = {
   0..25  => { low_battery_count:     13 }, 
  26..75  => { average_battery_count:  4 }, 
  76..100 => { good_battery_count:     4 }
}

现在,需要的是一种方法(最好是内置方法),如果我传递一个值(整数,例如 20、30 等),它应该返回该整数所在范围的值。

我已经使用每种方法解决了它,但现在我想优化它, 更重要的是,无需使用each或map方法来减少其复杂性。

例如:

method(3) #=> {:low_battery_count=>13}
method(35) #=> {:average_battery_count=>4}
method(90) #=> {:good_battery_count=>4}
ruby-on-rails ruby ruby-on-rails-3 ruby-hash
3个回答
1
投票

您可以使用

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

1
投票

您需要获取准确的密钥才能从哈希中获取值。因此,无论哪种方式,都应该根据可用的键(范围)来测试通过的数字。

您可以考虑引入一种基于为常量分配预定范围并使用大小写相等检查的优化:

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}

1
投票

我们可以使用一些内置方法来做到这一点,但没有任何直接的方法来做到这一点

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}]
© www.soinside.com 2019 - 2024. All rights reserved.