1

我有一个哈希,其中包含一个哈希,其中包含许多数组,如下所示:

{ "bob" =>
    {  
       "foo" => [1, 3, 5],
       "bar" => [2, 4, 6]
    },
  "fred" =>
    {  
       "foo" => [1, 7, 9],
       "bar" => [8, 10, 12]
    }
} 

我想将这些数组与其他数组进行比较,然后提醒我它们是否重复。hash["bob"]["foo"]和有可能hash["fred"]["foo"]重复,但不能hash["bob"]["foo"]重复hash["bob"]["bar"]。与 相同hash["fred"]

我什至不知道从哪里开始。我怀疑inject会涉及到某个地方,但我可能是错的。

4

4 回答 4

1
h =  {
  "bob" =>
    {
       "foo" => [1, 3, 5],
       "bar" => [2, 4, 6]
    },
  "fred" =>
    {  
       "foo" => [1, 7, 9],
       "bar" => [1, 10, 12]
    }
}

h.each do |k, v|
  numbers = v.values.flatten
  puts k if numbers.length > numbers.uniq.length
end
于 2012-09-28T13:44:26.667 回答
1

此代码段将为每个键返回一组重复项。只能为相等的键生成重复项。

duplicates = (keys = h.values.map(&:keys).flatten.uniq).map do |key|
  {key =>  h.values.map { |h| h[key] }.inject(&:&)}
end

这将返回[{"foo"=>[1]}, {"bar"=>[]}]表明该键foo是唯一一个包含1.

上面的代码片段假设h是您的哈希的变量名称。

于 2012-09-28T14:00:01.397 回答
0

有很多方法可以做到这一点。这是一个应该易于阅读的内容。它适用于 Ruby 1.9。它使用 + 组合两个数组,然后使用 uniq! 算子来判断是否有重复号码。

h = { "bob" =>
{  
   "foo" => [1, 3, 5],
   "bar" => [2, 4, 6]
},
"fred" =>
{  
   "foo" => [1, 7, 12],
   "bar" => [8, 10, 12]
}
}

h.each  do |person|
    if (person[1]["foo"] + person[1]["bar"]).uniq! != nil  
        puts "Duplicate in #{person[1]}"
    end
end
于 2012-09-28T13:32:55.960 回答
0

我不确定您到底在寻找什么。但是看看一个可能的解决方案,也许你可以重用一些东西。

outer_hash.each do |person, inner_hash|
  seen_arrays = Hash.new

  inner_hash.each do |inner_key, array|
    other = seen_arrays[array]
    if other
      raise "array #{person}/#{inner_key} is a duplicate of #{other}"
    end
    seen_arrays[array] = "#{person}/#{inner_key}"
  end
end
于 2012-09-28T13:37:20.750 回答