2010-03-25 86 views
3

我想從Ruby中的一組數組中獲取一個公共元素。通常情況下,您可以使用運算符來比較兩個數組,這兩個數組返回兩個數組中都存在或共同的數組。這一切都很好,除非你試圖從超過兩個陣列中獲取通用元素。但是,我想從未知的動態數組中獲取公共元素,這些元素存儲在散列中。這是從數組哈希中獲取常用元素的最佳方式嗎?

我不得不求助於在ruby中使用eval()方法,該方法將字符串作爲實際代碼執行。下面是我寫的函數:

def get_common_elements_for_hash_of_arrays(hash) # get an array of common elements contained in a hash of arrays, for every array in the hash. 
     # ["1","2","3"] & ["2","4","5"] & ["2","5","6"] # => ["2"] 
     # eval("[\"1\",\"2\",\"3\"] & [\"2\",\"4\",\"5\"] & [\"2\",\"5\",\"6\"]") # => ["2"] 
     eval_string_array = Array.new # an array to store strings of Arrays, ie: "[\"2\",\"5\",\"6\"]", which we will join with & to get all common elements 
     hash.each do |key, array| 
      eval_string_array << array.inspect 
     end 
     eval_string = eval_string_array.join(" & ") # create eval string delimited with a & so we can get common values 
     return eval(eval_string) 
    end 

example_hash = {:item_0 => ["1","2","3"], :item_1 => ["2","4","5"], :item_2 => ["2","5","6"] } 
puts get_common_elements_for_hash_of_arrays(example_hash) # => 2 

這工作和是偉大的,但我不知道...... EVAL,真的嗎?這是最好的方法嗎?有沒有其他的方法可以完成這個任務(當然除了遞歸函數之外)。如果任何人有任何建議,我都耳熟能詳。

否則,如果您需要從一個組或數組哈希中獲取一個通用項目或元素,則可以隨意使用此代碼,此代碼也可以很容易地用於搜索數組數組。

+0

不要忘了將您的問題標記爲已回答。 – 2010-03-26 21:18:30

回答

15

看到inject的威力! ;)

[[1,2,3],[1,3,5],[1,5,6]].inject(&:&) 
=> [1] 

喬丹提到的,如果你的Ruby版本缺少& -notation支持,只需使用

inject{|acc,elem| acc & elem} 
+0

聰明!所以只要將它應用到hash.values就可以做到這一點。 – miorel 2010-03-25 19:10:01

+1

這是一個非常簡潔的答案,但是正確。由於你的值是在一個散列,所以做到這一點:hash.values.inject(&:&)。如果您使用的是不支持&簡寫的Ruby版本,那麼這是您想要的:hash.values.inject {| acc,arr | acc&arr} – 2010-03-25 19:11:50

+0

@Jordan:謝謝,我更新了答案。我故意省略'hash.values'部分,因爲恕我直言,它只是掩蓋了這一點。 – 2010-03-25 19:24:24

0

難道你不能只比較頭兩個,拿結果和下一個比較嗎?這似乎符合你的標準。

0

爲什麼不能做到這一點:

def get_common_elements_for_hash_of_arrays(hash) 
    ret = nil 
    hash.each do |key, array| 
     if ret.nil? then 
      ret = array 
     else 
      ret = array & ret 
     end 
    end 
    ret = Array.new if ret.nil? # give back empty array if passed empty hash 
    return ret 
end 
相關問題