Techioz Blog

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"

ハッシュ/配列が非常に大きい場合は、同様に機能する二分検索の使用を検討することもできます。