Ruby / Rails は初期範囲から値を見つけます
概要
キーの値と次のキーの値に基づいてハッシュのキーを見つける最良の方法は何ですか?
例を使用すると理解しやすくなります。
このコードを考慮すると、次のようになります。
h = {
'size-1': 0,
'size-2': 50,
'size-3': 100,
'size-4': 150,
}
def find_key(value)
# ...
end
find_key(0) -> 'size-1'
find_key(25) -> 'size-1'
find_key(50) -> 'size-2'
find_key(51) -> 'size-2'
find_key(99) -> 'size-2'
find_key(9999) -> 'size-4'
解決策
値によって各「範囲」の始まりが定義されるため、逆方向の検索が簡単になります。そのためには、反転配列を作成します: (期待される出力に従って、ハッシュ値をシンボルから文字列に変更しました)
@hash = {
'size-1' => 0,
'size-2' => 50,
'size-3' => 100,
'size-4' => 150
}
@pairs = @hash.to_a.reverse
#=> [["size-4", 150], ["size-3", 100], ["size-2", 50], ["size-1", 0]]
または @pairs = @hash.sort_by { |_k, v| 経由-v } ハッシュがまだソートされていない場合。
find を使用して配列を検索できるようになりました: (最初にペアのキーを返します)
def find_key(value)
@pairs.find { |_k, v| v <= value }.first
end
これにより、次のようになります。
find_key(0) #=> "size-1"
find_key(25) #=> "size-1"
find_key(50) #=> "size-2"
find_key(51) #=> "size-2"
find_key(99) #=> "size-2"
find_key(9999) #=> "size-4"
ハッシュ/配列が非常に大きい場合は、同様に機能する二分検索の使用を検討することもできます。