条件付きのa、b、cと言う3つの整数配列の交差要素を見つける必要があります。配列のいずれかがnull([]
)の場合は、その配列を無視して残りの配列の共通部分を見つけ、3つすべてがnullの場合は、[]を返します。前もって感謝します。
ps:Ruby 1.9.3
条件付きのa、b、cと言う3つの整数配列の交差要素を見つける必要があります。配列のいずれかがnull([]
)の場合は、その配列を無視して残りの配列の共通部分を見つけ、3つすべてがnullの場合は、[]を返します。前もって感謝します。
ps:Ruby 1.9.3
これを行う1つの方法は次のとおりです。
[ a, b, c ].tap{ |a| a.delete( [] ) }.reduce( :& ) || []
ディスカッションで提案されている他のオプションは次のとおりです。
[ a, b, c ].reject( &:empty? ).reduce( :& ) || []
と:
[ a, b, c ].select( &:any? ).reduce( :& ) || []
しかし、この最後のケースでは、などの明示的なnil要素を持つ空でない配列に注意してください[ nil ]
。それでも#any?テスト。
[a, b, c].reject(&:blank?).reduce(:&)
これを行うにはおそらくもっと簡潔な方法がありますが、これで必要なものが得られるはずです。
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(&:&)