【问题标题】:Is this the best way to grab common elements from a Hash of arrays?这是从数组哈希中获取公共元素的最佳方法吗?
【发布时间】:2010-03-25 18:58:40
【问题描述】:

我正在尝试从 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

这很有效,而且很棒,但我想知道...评估,真的吗?这是最好的方法吗?是否还有任何其他方法可以实现这一点(当然,除了递归函数)。如果有人有任何建议,我会全力以赴。

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

【问题讨论】:

  • 不要忘记将您的问题标记为已回答。

标签: ruby


【解决方案1】:

看看inject 的力量吧! ;)

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

正如 Jordan 所说,如果您的 Ruby 版本不支持 &-notation,请使用

inject{|acc,elem| acc & elem}

【讨论】:

  • 聪明!因此,只需将其应用于 hash.values 就可以了。
  • 这是一个非常简洁的答案,但正确。由于您的值在哈希中,请执行以下操作:hash.values.inject(&:&)。如果您在不支持 & 速记的 Ruby 版本上运行,这就是您想要的:hash.values.inject {|acc, arr| ACC & ARR}
  • @Jordan:谢谢,我更新了答案。我故意省略了hash.values 部分,因为恕我直言,它只是模糊了这一点。
  • 太棒了。这样就可以了。谢谢大家-拿那个,评估!
  • 非常可爱 :-) 如果在 Ruby 1.8.6 中,我建议 require 'backports' 获得非常好的 &amp;:symbol 表示法。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    为什么不这样做:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      相关资源
      最近更新 更多