首页 > 解决方案 > 给定一个带有值数组的哈希,如何提取每个键的唯一值的数量?

问题描述

我有一个散列,每个键都有一个值数组:

h = {
  'a' => ['c', 'b', 'd'],
  'b' => ['c', 'b', 'f', 'g']
}

我需要返回一个散列g,它给出每个键的“唯一”值的数量h。例如,h['a']有 2 个值 ('c'b') 在它们存在于 的意义上不是唯一的h['b']。在这种情况下,'a'in的值g应该相等1,因为'd'是 的唯一唯一元素h['a']。钥匙也是如此'b'。它有 2 个与'a'in共同的值h,但也有 2 个独特的值('f'g')。所以在我的情况下g应该等于{'a' => 1,b => 2}

我试过h.select { |_,a| a.size == 1 }了,但它返回一个空哈希。

另外,我有一种返回唯一值的方法,但是当我尝试编写 Rspec 测试时它失败了,我的解决方案如下:

@split_log_file.each { |key, array|
  "#{key} has #{array.uniq.length} unique visitors" }

标签: arraysruby

解决方案


这应该符合您的要求。

def uniqify(h)
  keys = h.keys
  keys.each_with_object({}) { |k,g| g[k] =
    (keys-[k]).reduce(h[k]) { |a,kk| a-h[kk] }.uniq.size } }
end

h = { 'cat' => ['c', 'b', 'e', 'f', 'c'],
      'dog' => ['c', 'b', 'f', 'g', 'h'] }

uniqify h
  #=> {"cat"=>1, "dog"=>2}

h = { 'cat' => ['c', 'b', 'd', 'c', 'e', 'f'],
      'dog' => ['c', 'b', 'f', 'g'],
      'pig' => ['h', 'h', 'b', 'f'] }

uniqify h
  #=> {"cat"=>2, "dog"=>1, "pig"=>1}

请参阅数组#-


推荐阅读