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

Cger007 · 发布于 2016年11月18日 · 最后由 Cger007 回复于 2016年11月18日 · 592 次阅读
96

如何判断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
共收到 14 条回复
5
mimosa · #1 · 2016年11月18日
[1] pry(main)> [1,2,3] & [2,3,4]
=> [2, 3]
2楼 已删除
96
Cger007 · #3 · 2016年11月18日

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

19106
yingce · #4 · 2016年11月18日

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

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

5
mimosa · #5 · 2016年11月18日

#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
96
Cger007 · #6 · 2016年11月18日

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

5
mimosa · #7 · 2016年11月18日

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

def diff_group(a, b, c = ['TEST'])
  (a & b - c).empty?  
end 
96
Cger007 · #8 · 2016年11月18日

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

5
mimosa · #9 · 2016年11月18日

#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
96
Cger007 · #10 · 2016年11月18日

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

16154
hfpp2012 · #11 · 2016年11月18日
[4, 5, 3] & [1, 3, 5]
=> [5, 3]

[1, 2, 3]  & [4, 5, 6]
=> [] 
2973
small_fish__ · #12 · 2016年11月18日
a = [1,2]
b = [2,3]
(a - b).length != a.length

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

5
mimosa · #13 · 2016年11月18日

#11楼 @Cger007 用减好吗 🔞

[1] pry(main)> [4, 5, 3] & []
=> []
[2] pry(main)> [4, 5, 3] - []
=> [4, 5, 3]
96
Cger007 · #14 · 2016年11月18日

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

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