Ruby 如何判断 Ruby 两个数组中,是否有相同元素,求方法

Cger007 · 2016年11月18日 · 最后由 Cger007 回复于 2016年11月18日 · 4325 次阅读

如何判断 ruby 两个数组中,是否有相同元素,求方法

    #当前用户的GROUP
current_user_groups = User.find(User.current.id).groups.collect(&:lastname)
# 被指派用户的GROUP
assigned_user_groups = User.find(assigned_to_id).groups.collect(&:lastname)

#设置默认为同组
diff_group = false

#判断指派人与被指派人是否同组
current_user_groups.each do |k|
    assigned_user_groups.each do |e|
        if k != e && e!= "TEST"
            logger.info"#{k}"
            diff_group = true
            logger.info"#{e}"
        end
    end
end
[1] pry(main)> [1,2,3] & [2,3,4]
=> [2, 3]
2 楼 已删除

#1 楼 @mimosa 我把问题描述写的详细一些,帮看看

Group.where(user_id: User.current.id).where(id: Group.where(user_id: assigned_to_id).select(:id)).exists?

SQL 查速度相对会很快,不知道你表是怎样设计的 大概就是这意思

#3 楼 @Cger007 你的代码本身就有错 😜

# 当前用户的GROUP
current_user_groups = ['ADMIN', 'USER']
# 被指派用户的GROUP
assigned_user_groups = ['USER', 'TEST', 'ADMIN']
=> true

起码应该这样:

# 判断指派人与被指派人是否同组
def diff_group(a, b)
  diff = false # 设置默认为同组
  a.each do |k|
    b.each do |e|
      puts "#{k} <=> #{e}"
      diff = (k != e && e!= "TEST")
    end
  end
  diff
end

如果是俺理解错了,那也该这样:

# 判断指派人与被指派人是否同组
def diff_group(a, b)
  a.each do |k|
    b.each do |e|
      if k != e && e!= "TEST"
        puts "#{k} <=> #{e}"
        return true
      end
    end
  end
  false # 设置默认为同组
end

#5 楼 @mimosa 对的,是有错,总是 java 思维,两次 for 循环去做判断

#6 楼 @Cger007 所以请问怎样的两组才算是不同的?给两组测试数据呗😋

def diff_group(a, b, c = ['TEST'])
  (a & b - c).empty?  
end 

#7 楼 @mimosa 两个用户 a 所在的组 ["过程质量组", "HMI"] 和 b 所在的组 ["过程质量组"],这就属于同组

#8 楼 @Cger007 那楼上的方法就可以啦。

同组测试:

[1] pry(main)> # 当前用户的GROUP
[2] pry(main)> current_user_groups = ['ADMIN', 'USER']
=> ["ADMIN", "USER"]
[3] pry(main)> # 被指派用户的GROUP
[4] pry(main)> assigned_user_groups = ['USER', 'TEST', 'GUEST']
=> ["USER", "TEST", "GUEST"]
[5] pry(main)> diff_group(current_user_groups, assigned_user_groups)
=> false

异组测试:

[1] pry(main)> # 当前用户的GROUP
[2] pry(main)> current_user_groups = ['ADMIN', 'USER', 'TEST']
=> ["ADMIN", "USER", "TEST"]
[3] pry(main)> # 被指派用户的GROUP
[4] pry(main)> assigned_user_groups = ['TEST', 'GUEST']
=> ["TEST", "GUEST"]
[5] pry(main)> diff_group(current_user_groups, assigned_user_groups)
=> true

#9 楼 @mimosa 十分感谢,这个被我弄好了,用的是两个数组做减法,然后再去比较,还是谢谢~

[4, 5, 3] & [1, 3, 5]
=> [5, 3]

[1, 2, 3]  & [4, 5, 6]
=> [] 
a = [1,2]
b = [2,3]
(a - b).length != a.length

习惯用少的那个去减,true 表示有交集,false 表示没有

#11 楼 @Cger007 用减好吗 🔞

[1] pry(main)> [4, 5, 3] & []
=> []
[2] pry(main)> [4, 5, 3] - []
=> [4, 5, 3]

#13 楼 @mimosa ruby #判断指派人与被指派人是否同组 if current_user_groups == (current_user_groups - assigned_user_groups) diff_group = true end 可以达到我要的结果👀

需要 登录 后方可回复, 如果你还没有账号请 注册新账号