Ruby on rails 如何在忽略空数组的情况下找到3个数组的交集?

Ruby on rails 如何在忽略空数组的情况下找到3个数组的交集?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我必须找到3个整数数组的交集元素 有条件地说a、b、c;如果数组中的任何一个为空[], 只需忽略该数组并找到其余数组的交点, 如果这三个都为null,则返回[]。 提前谢谢 ps:Ruby 1.9.3可能有一种更简洁的方法来实现这一点,但这应该能满足您的需要 def intersection(*arrays) # Reduce the list of arrays to only the ones with elements arrays = arrays.select(&:fi

我必须找到3个整数数组的交集元素 有条件地说a、b、c;如果数组中的任何一个为空[], 只需忽略该数组并找到其余数组的交点, 如果这三个都为null,则返回[]。 提前谢谢


ps:Ruby 1.9.3

可能有一种更简洁的方法来实现这一点,但这应该能满足您的需要

def intersection(*arrays)
  # Reduce the list of arrays to only the ones with elements
  arrays = arrays.select(&:first)

  return [] if arrays.empty?

  # Grab the first array
  intersection = arrays.pop

  # Iterate over the arrays finding the intersection
  arrays.each do |array|
    intersection = intersection & array
  end

  # Return the resultant array
  intersection
end
更新

我知道有一种方法可以在所有数组元素之间应用运算符,但由于某种原因,我在查看数组文档时忽略了reduce。减少绝对是一条必由之路:

arrays.reject(&:empty?).reduce(&:&)

一种方法是:

[ a, b, c ].tap{ |a| a.delete( [] ) }.reduce( :& ) || []
讨论中建议的其他选项包括:

[ a, b, c ].reject( &:empty? ).reduce( :& ) || []
以及:


但在最后一种情况下,请注意带有显式nil元素(如[nil])的非空数组,因为它们仍然会失败?测试。

你能发布一些示例数组和预期结果吗?a=[]b=[1,2]c=[2]result=[2]@tokland一些奇怪的东西:如果a.存在,p`i=-1i+=1?如果b存在,i+=1?如果存在c,i+=1?res=a+b+c res.select{e | res.counte>i}`tap{a | a.delete[]:也许最好是拒绝&:empty?。回答得好,但我会替换。点击{a | a.delete[]}。选择&:any以避免零输出:reduce[],:&。请不要这样使用tap+delete,这非常复杂。@tokland reduce[],:&在这种特殊情况下不起作用…将始终返回[]。将第二个选项编辑为[a,b,c].reject&:empty?.reduce:&别忘了需要“active\u support/core\u ext/object/blank”首先,操作符不需要符号&:&,:&就足够了。其次,您显然无法在数组文档中遇到reduce,因为它是可枚举的mixin方法,因此可用于所有集合,而不仅仅是数组。我赞扬您的努力。@boris stitnicky啊,你只需要:&?我不知道。这是1.9.x的变化,还是一直如此?我想是1.9.x的变化。例如,要将数字从1加到10,你现在可以写[*1..10]。reduce:+。
[a, b, c].reject(&:blank?).reduce(:&)
[a, b, c].reject(&:blank?).reduce(:&)