比较具有相同键的两个哈希数组

时间:2015-12-06 22:17:40

标签: arrays ruby hash

我有两个具有相同键但值不同的哈希数组。

A = [{:a=>1, :b=>4, :c=>2},{:a=>2, :b=>1, :c=>3}]
B = [{:a=>1, :b=>1, :c=>2},{:a=>1, :b=>3, :c=>3}]

我试图将A中的第一个哈希值与B中的第一个哈希值进行比较,依此类推,使用它们的键,并确定哪个键与哪个值不匹配,如果它们不匹配。请帮忙。

    A.each_key do |key|
      if A[key] ==  B[key]
        puts "#{key} match"
      else
        puts "#{key} dont match"

3 个答案:

答案 0 :(得分:5)

我不确定您想要进行哪些比较,因此我将展示回答不同问题的方法。你想对两个哈希数组进行成对比较,但这并不比仅仅比较两个哈希更困难,我稍后会说明。现在,假设您只想比较两个哈希值:

h1 = {:a=>1, :b=>4, :c=>2, :d=>3 }
h2 = {:a=>1, :b=>1, :c=>2, :e=>5 }

h1h2(或两者)中有哪些键?

h1.keys | h2.keys
  #=> [:a, :b, :c, :d, :e]

请参阅Array#|

两个哈希中有哪些键?

h1.keys & h2.keys
  #=> [:a, :b, :c] 

请参阅Array#&

h1h2中有哪些键?

h1.keys - h2.keys
  #=> [:d] 

请参阅Array#-

h2h1中有哪些键?

h2.keys - h1.keys #=> [:e] 

只有一个哈希中的哪些键?

(h1.keys - h2.keys) | (h2.keys - h1.keys)
  #=> [:d, :e]

(h1.keys | h2.keys) - (h1.keys & h2.keys)

两个哈希中的哪些键在两个哈希中都有相同的值?

(h1.keys & h2.keys).select { |k| h1[k] == h2[k] }
  #=> [:a, :c] 

请参阅Array#select

两个哈希值中的哪些键有两个哈希值?

(h1.keys & h2.keys).reject { |k| h1[k] == h2[k] }
  #=> [:b] 

假设现在我们有两个哈希数组:

a1 = [{:a=>1, :b=>4, :c=>2, :d=>3 }, {:a=>2, :b=>1, :c=>3, :d=>4}]
a2 = [{:a=>1, :b=>1, :c=>2, :e=>5 }, {:a=>1, :b=>3, :c=>3, :e=> 6}]

并希望成对地比较哈希。要做到这一点,首先采取上面的兴趣计算,并将其包装在一个方法中。例如:

def keys_in_both_with_different_values(h1, h2)
  (h1.keys & h2.keys).reject { |k| h1[k] == h2[k] }
end

然后写:

a1.zip(a2).map { |h1,h2| keys_in_both_with_different_values(h1, h2) }
  #=> [[:b], [:a, :b]]

请参阅Enumerable#zip

答案 1 :(得分:0)

因为你要比较数组的元素......

A.each_with_index do |hasha, index|
  hashb = B[index]
  hasha.each_key do |key|
    if hasha[key] == hashb[key]
      puts "in array #{index} the key #{key} matches"
    else
      puts "in array #{index} the key #{key} doesn't match"
    end
  end
end

编辑 - 添加了遗失end

答案 2 :(得分:0)

当你处理一个数组时,你应该引用一个带有开 - 关括号的元素' []'如在

$this->db->distinct('pd_model_code AS Model_SKU');
$this->db->select('pd_model_description AS `Model_Title`');
$this->db->like('pd_vendor',$brand);
$query=$this->db->get('iris_product_data');

如果要访问哈希中的元素,则需要使用带有相应键的开闭括号,如

A[index at which lies the element you are looking for]

(引用与键':a'对应的值,它是类型符号。)

在这种情况下,所讨论的数组是哈希嵌套在数组中的。因此,例如,表达式B [0] [:c]将给出2。

要比较A中的第一个哈希值和B中的第一个哈希值,A中的第二个哈希值以及B中的第二个哈希值,依此类推,你可以在Array对象上使用each_with_index方法,就像这样;

A[:a] 

,它按照以下顺序检查基于键的值,这些符号是符号; :a - > :b - > :c - > :a - > :b - > :C 这将打印出来;

A = [{:a=>1, :b=>4, :c=>2},{:a=>2, :b=>1, :c=>3}]
B = [{:a=>1, :b=>1, :c=>2},{:a=>1, :b=>3, :c=>3}]
sym = [:a, :b, :c]

A.each_with_index do |hash_a, idx_a|
  sym.each do |sym|
    if A[idx_a][sym] == B[idx_a][sym]
      puts "Match found! (key -- :#{sym}, value -- #{A[idx_a][sym]})"
    else
      puts "No match here."
    end 
  end
end

如果您不熟悉,each_with_index方法可能看起来有点神秘。 如果您对此感到不舒服,可能需要检查;
http://apidock.com/ruby/Enumerable/each_with_index

最后但并非最不重要的是,不要忘记在一个块的末尾添加“结束”(即do / end之间的代码)和代码中的if语句。 / p>

我希望它有所帮助。