私は次のような配列としていくつかのキーを持つハッシュを持っています:
foo = {[45, 121]=>:some_field}
fooキーに45が含まれている:some_fieldを選択するにはどうすればよいですか?
次に、一致するものが見つかった場合、同じキー内の他の要素を取得するにはどうすればよいですか?
私は次のような配列としていくつかのキーを持つハッシュを持っています:
foo = {[45, 121]=>:some_field}
fooキーに45が含まれている:some_fieldを選択するにはどうすればよいですか?
次に、一致するものが見つかった場合、同じキー内の他の要素を取得するにはどうすればよいですか?
これは可能ですが、全体を線形スキャンする必要があるため、ハッシュを使用する目的が損なわれます。ハッシュをインデックスとして使用できるため、同じ値に対して複数のハッシュキーを使用する方がはるかに優れています。
例:
found = foo.find { |k, v| k.include?(n) }
found and found[1]
キーに多数のエントリがあり、ハッシュに多数のアイテムがある場合、すべてのキーとすべての値を個別にテストする必要があるため、このパフォーマンスはひどいものになることに注意してください。
foo = {[45, 121]=>:some_field}
foo.detect{ |k,v| k.include? 45 }
#=> [[45, 121], :some_field]
foo.detect{ |k,v| k.include? 45 }.last
#=> :some_field
1つの要素だけではない場合は、ハッシュを逆にすることをお勧めします。
foo = {[45, 121]=>:some_field, [1, 45, 7] => :some_other_field}
bar = {}
foo.each do |k, v|
k.each do |x|
if bar.has_key?(x)
bar[x] << [[k, v]]
else
bar[x] = [[k, v]]
end
end
end
p bar[45]