我有一个散列,其中包含一个散列,其中包含许多数组,如下所示:
{ "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
会涉及某个地方,但我可能错了。
答案 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