我有一系列人的ID:
people_id = [1111, 2222, 3333, 4444, 5555]
和嵌套数组的哈希值如下:
hash = {1234 => [1111], 1235 => [2222, 4444], 1236 => [1111, 1111, 5555, 1236]}
我需要询问每个数组hash
,并将其与people_id
数组进行比较。如果任何散列数组包含来自people_id
的多个值,那么我需要返回键,因此在此示例中我希望返回1235
和1236
,因为:< / p>
1234
为false(只有people_id
中的一个元素存在)1235
为真(2222
和4444
都存在)1236
为真(1111
和5555
都存在)有人可以提供建议吗?
答案 0 :(得分:4)
hash.select{|_, v| (v & people_id).length > 1}.keys
# => [1235, 1236]
答案 1 :(得分:1)
hash = {
1234 => [1111],
1235 => [2222, 4444],
1236 => [1111, 1111, 5555, 1236]
}
array = [1111, 2222, 3333, 4444, 5555]
hash.each_with_object([]) do |(k, v), acc|
acc << k if (v & array).size > 1
end
#⇒ [1235, 1236]
这里我们遍历哈希对象,检查值与原始数组的交集是否包含多于一个元素,如果是,则向累加器添加一个键。
请注意,如果(v & array).size
保证唯一,array
将是一个很好的优点。
答案 2 :(得分:0)
注意我是编程的新手,所以这是我尝试使用两个辅助变量并设置:
require 'set'
peopleIDArray = [1111, 2222, 3333, 4444, 5555]
peopleHash = {1234 => [1111], 1235 => [2222, 4444], 1236 => [1111, 1111, 5555, 1236]}
result = Set[]
peopleHash.each do |key, value|
foundOnePerson = false
foundTwoPerson = false
value.each { |id|
if peopleIDArray.include? id and !foundOnePerson
foundOnePerson = true
next
end
if peopleIDArray.include? id and !foundTwoPerson
foundTwoPerson = true
end
if foundOnePerson and foundTwoPerson
result.add(key)
end
}
end
p result.to_a # => [1235, 1236]