我想在的参数的散列密钥比较针对一个匹配元件的阵列。
例如:
params = {"key1", "key2", "key3"}
params_to_match = ["key2","key3"]
我能做到这一点,但我敢肯定有一个更优雅的方式来acheive相同的结果
params.each_key{|key|
if params_to_match.include?(key.to_s)
return
end
}
我想在的参数的散列密钥比较针对一个匹配元件的阵列。
例如:
params = {"key1", "key2", "key3"}
params_to_match = ["key2","key3"]
我能做到这一点,但我敢肯定有一个更优雅的方式来acheive相同的结果
params.each_key{|key|
if params_to_match.include?(key.to_s)
return
end
}
不一定更有效 ,但也许在某种意义上更优雅 :
return unless (params.keys & params_to_match).empty?
更有效的方式比你的例子将(在一般情况下,不一定有这样一个小玩具为例)是检查哈希是否包含关键字,因为时间去看看那些起来实际上是恒定的,而从阵列中查找它们为O(n)。 所以,你的例子会变成这样的事情:
params_to_match.each { |p| return if params.has_key?(p) }
&
设置交叉口-返回包含共用的两个数组元素,没有重复的新数组。
[ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ]
params.keys & params_to_match #=> ["key2", "key3"]
我觉得优雅和高效率的最佳组合是
return if params_to_match.any? { |p| params.has_key?(p) }
如果你有的ActiveSupport,你可以这样做
return if params.slice(*params_to_match).any?
下面是一个psedudocode快速算法。
assert keys, input are sorted
pos = beginning of keys
for i in input
pos = keys.find(pos, i) # find() starts search at position pos
if not_found(pos) then return false
++pos
return true
该算法,假设键和输入进行排序,首先,在O(N + M)执行,n和m是键和输入的计数。 我就讲这些,你那意思就是红宝石,但要密切注意find()
函数; 它必须启动其在先前的迭代中,而不是在钥匙的开始位置搜索。 否则,你到为O(n ^ 2 + M),N键的数量。