使用Ruby,什么是最有效的方法来检查,如果在哈希任意键阵列内匹配任何值(Using Ruby, w

2019-10-21 12:47发布

我想在的参数的散列密钥比较针对一个匹配元件的阵列。

例如:

params          = {"key1", "key2", "key3"}
params_to_match = ["key2","key3"]

我能做到这一点,但我敢肯定有一个更优雅的方式来acheive相同的结果

params.each_key{|key|
  if params_to_match.include?(key.to_s)
    return
  end
}

Answer 1:

不一定更有效 ,但也许在某种意义上更优雅

return unless (params.keys & params_to_match).empty?

更有效的方式比你的例子将(在一般情况下,不一定有这样一个小玩具为例)是检查哈希是否包含关键字,因为时间去看看那些起来实际上是恒定的,而从阵列中查找它们为O(n)。 所以,你的例子会变成这样的事情:

params_to_match.each { |p| return if params.has_key?(p) }


Answer 2:

使用&

设置交叉口-返回包含共用的两个数组元素,没有重复的新数组。

[ 1, 1, 3, 5 ] & [ 1, 2, 3 ]   #=> [ 1, 3 ]

params.keys & params_to_match  #=> ["key2", "key3"]


Answer 3:

我觉得优雅和高效率的最佳组合是

return if params_to_match.any? { |p| params.has_key?(p) }

如果你有的ActiveSupport,你可以这样做

return if params.slice(*params_to_match).any?


Answer 4:

下面是一个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键的数量。



文章来源: Using Ruby, what is the most efficient way to check if any key in a hash matches any values within an Array