簡體   English   中英

使用Ruby,最有效的方法是檢查哈希中的任何鍵是否匹配數組中的任何值

[英]Using Ruby, what is the most efficient way to check if any key in a hash matches any values within an Array

我想將參數散列中的鍵與元素數組進行匹配。

例如:

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

我可以這樣做,但是我敢肯定,有一種更優雅的方法可以達到相同的結果

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是鍵和輸入的計數。 我將其留給您將其翻譯為Ruby,但請密切注意find()函數; 必須在上一次迭代中找到的位置開始搜索,而不是在鍵的開頭開始搜索。 否則,您將獲得鍵數量為O(n ^ 2 + m),n。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM