在嵌套数组中查找重复项

时间:2012-09-28 12:16:18

标签: ruby

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

{ "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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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是哈希的变量名。

答案 2 :(得分: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

答案 3 :(得分: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