最小化嵌套循环

时间:2016-07-27 02:46:31

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我有以下嵌套循环的代码。如何最小化循环?

users结果如下:

users = [[35, 61, 62, 63, 64, 65, 66, 67, 68, 69, nil, 70, 71, 72, 73,
          74, 75, 78, 79, 92, 94, 95, 154, 164, 292, 293, 294, 295, 314],
         [],
         [35],
         [],
         [35, 79, 88],
         [],
         [],
         [36, 35, 56, 78, 87, 95, 65],
         [63, 72, 78, 80, 81, 82, 84, 87, 90, 93, nil, 96, 111, 157, 159, 160, 271,
          272, 66, 295, 296, 297, 298, 299, 300, 301, 305, 307, 308, 71, 315],
         [],
         [79, 83, 85, 86, 89, 91, 161, 162, 163, 67, 294, 302, 303, 304, 306,
          309, 310, 311, 312, 313],
         [],
         [314],
         [314],
         []
        ]

这就是我需要在每个元素中循环对象的原因。

array值为:

array = [309, 310, 305, 304, 90, 162, 78, 297, 296, 272, 271, 84, 91, 308,
         299, 79, 87, 298, 301, 163, 81, 72, 83, 111, 86, 313, 164, 300, 159,
         315, 160, 307, 82, 69, 312, 89
        ]

谢谢!

0.upto(users.count).each do |i|
  users[i].each do |user_id|
    if array.include?(user_id)
      puts user_id
    end
  end
end

2 个答案:

答案 0 :(得分:2)

根据我的理解,您希望从usersarray获取共同元素。

首先使users数组flatten成为单个数组。然后将其设为uniq,以便一个id不会再次重复。 compact将删除nil值。之后,使用&进行array操作。你得到了result

result = users.flatten.uniq.compact & array

现在,如果您要打印result

puts result

答案 1 :(得分:1)

如果每个用户子数组都没有重复元素,那么以下内容应该可以正常工作

users.each { |user| puts array & user }