这是从哈希数组中获取常用元素的最佳方法吗?

我试图从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 < ["1","2","3"], :item_1 => ["2","4","5"], :item_2 => ["2","5","6"] } puts get_common_elements_for_hash_of_arrays(example_hash) # => 2 

这很有效,但我很想知道…… 真的吗? 这是最好的方法吗? 有没有其他方法可以实现这一点(当然除了递归function)。 如果有人有任何建议,我会全力以赴。

否则,如果您需要从组或数组散列中获取公共项或元素,请随意使用此代码,此代码也可以轻松地适用于搜索数组数组。

注意inject的力量! ;)

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

正如Jordan提到的,如果你的Ruby版本缺乏对-not的支持,那就用吧

 inject{|acc,elem| acc & elem} 

你不能只对前两个进行比较,取结果并将其与下一个进行比较等吗? 这似乎符合您的标准。

为什么不这样做:

 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