-1

3 つのハッシュがあり、それらに共通するキーを出力したいと考えています。

hash1 = {a: "3", b: "2" c: "1"}
hash2 = {b: "2" c: "1"}
hash3 = {b: "2" c: "1", d: "4"}

上記の例では、共通キーは と にbなりcます。

これを多くのハッシュにスケーリングする必要があります。これを行うための最も効率的でスケーラブルな方法は何ですか?

4

2 に答える 2

3
> hashes = [{a: 3, b: 4}, {a: 5, c: 6}, {a: 6, d: 2}]
=> [{:a=>3, :b=>4}, {:a=>5, :c=>6}, {:a=>6, :d=>2}]
> hashes.map(&:keys).inject { |shared, keys| shared & keys }
=> [:a]
于 2013-02-13T12:17:21.583 に答える
3

ええ、次のようなものが必要ですHash#intersect。幸いなことに、実装は簡単です。

class Hash
  def & another
    result = {}
    self.each do |k, v|
      result[k] = v if another[k] == v
    end
    result
  end
end

hash1 = {a: "3", b: "2", c: "1"}
hash2 = {b: "2", c: "1"}
hash3 = {b: "2", c: "1", d: "4"}

hashes = [hash1, hash2, hash3]


hashes.reduce(:&) # => {:b=>"2", :c=>"1"}

注:このコードは、フィルターを通過するには、キーそれに対応する値が一致する必要があると想定しています。キー自体のみに関心がある場合は、そのようにコードを変更するのは非常に簡単です。お任せします。

于 2013-02-13T12:20:02.313 に答える