2

我必须找到具有条件的 3 个整数数组的交集元素,例如 a、b、c;如果任意一个数组为空[](提前致谢。

ps:红宝石1.9.3

4

3 回答 3

4

一种方法是:

[ a, b, c ].tap{ |a| a.delete( [] ) }.reduce( :& ) || []

讨论中建议的其他选项是:

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

和:

[ a, b, c ].select( &:any? ).reduce( :& ) || []

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

于 2012-10-26T20:00:55.730 回答
1
[a, b, c].reject(&:blank?).reduce(:&)
于 2012-10-26T20:09:36.760 回答
0

这样做可能有一种更简洁的方法,但这应该可以满足您的需求。

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在查看数组文档时错过了。reduce绝对是要走的路:

arrays.reject(&:empty?).reduce(&:&)
于 2012-10-26T20:00:46.983 回答