【问题标题】:Check that a hash includes another hash检查哈希是否包含另一个哈希
【发布时间】:2015-12-11 13:34:43
【问题描述】:

鉴于我有一个哈希数组 abc 和一个哈希 ghi

abc = [{
  'a' => '1',
  'b' => '2',
  'c' => '3',
  'd' => '4'
}]
ghi = {
  'a' => '1',
  'b' => '2'
}

abc 中选择包含ghi 中所有键值对的哈希的最干净、最有效的方法是什么?

我能够做到这一点:

abc.map {|n| n.slice(*ghi.keys) == ghi }.all?

虽然看起来不是很干净。

【问题讨论】:

  • 你的意思是散列数组吗?而不是哈希数组?因为哈希数组的含义类似于 [ {'a' => '1', 'b' => '2'}, {'a' => '77', 'c' => '24'} ]
  • 是的,这正是我的意思,给出的示例恰好只有一个元素。
  • 不能使用def作为变量名

标签: ruby hash ruby-1.9


【解决方案1】:

在 Ruby 2.3 中。

abc.select{|h| h >= ghi}

注意:这是在 OP 提到 Ruby 版本之前回答的。

Ruby 的早期版本:

abc.select{|h| h.merge(ghi) == h}

【讨论】:

  • 不幸的是,我使用的是 Ruby 1.9,谢谢。我更新了我的问题以包含我的 Ruby 版本。
  • 您之前的版本解决方案似乎产生了一个空数组
  • 我只是想说你只是放错了 h 和 ghi :) 但是让我告诉你,我很欣赏你的 Ruby 答案有多酷,真的 - 简短、准确和高效(即使我不确定,但您很可能知道)。
【解决方案2】:

不确定这是否是最快的。

abc.select{|hash| (ghi.to_a - hash.to_a).empty?}

【讨论】:

  • 很好的答案,但 ghi.to_a 应该被移出块。是的,这增加了一条线和一个变量,但有时您必须咬紧牙关去做。
【解决方案3】:

对于所有的key和value的检查,你可以试试:

abc = [
  {
    'a' => '1',
    'b' => '2',
    'c' => '3',
    'd' => '4'
  },
  {
    'a' => '33',
    'b' => '23'
  }
]
d = {
  'a' => '1',
  'b' => '2'
}
abc.select{|hash| ((hash.values <=> d.values) == 1 ) && ((hash.keys <=> d.keys) == 1 )}
# => [{"a"=>"1", "b"=>"2", "c"=>"3", "d"=>"4"}]

【讨论】:

    【解决方案4】:
    abc.select{|h| ghi.all?{|k,v| h.key?(k) && h.value?(v) } }
    

    基准测试结果:

    require 'benchmark'
    Benchmark.bm do |x|
      x.report { 10000.times { abc.select{|h| ghi.all?{|k,v| h.key?(k) && h.value?(v) } } } }
      x.report { 10000.times { abc.select{|h| h.merge(ghi) == h } } }
      x.report { 10000.times { abc.select{|hash| (ghi.to_a - hash.to_a).empty? } } }
      x.report { 10000.times { abc.select{|hash| (hash.values <=> ghi.values) == (hash.keys <=> ghi.keys) } } }
    end
    
           user     system      total        real
       0.040000   0.000000   0.040000 (  0.037253)
       0.040000   0.000000   0.040000 (  0.046138)
       0.150000   0.000000   0.150000 (  0.155893)
       0.020000   0.000000   0.020000 (  0.028176)
    

    看起来 Rajarshi 的答案是所有答案中最有效的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-19
      • 2017-04-28
      • 2011-11-26
      • 2017-04-13
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多