数组的散列是否包含数组中的数据

时间:2018-05-21 10:17:50

标签: arrays ruby hash

我有一系列人的ID:

people_id = [1111, 2222, 3333, 4444, 5555]

和嵌套数组的哈希值如下:

hash = {1234 => [1111], 1235 => [2222, 4444], 1236 => [1111, 1111, 5555, 1236]}

我需要询问每个数组hash,并将其与people_id数组进行比较。如果任何散列数组包含来自people_id的多个值,那么我需要返回键,因此在此示例中我希望返回12351236,因为:< / p>

  • 1234为false(只有people_id中的一个元素存在)
  • 1235为真(22224444都存在)
  • 1236为真(11115555都存在)

有人可以提供建议吗?

3 个答案:

答案 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]