以递归方式从多维数组中查找一组公共元素

时间:2010-04-06 12:45:13

标签: ruby multidimensional-array combinations

我有一个多维数组:

a=[[2,3,4],[1,3,4],[1,2],[1,2,3,4]]

我要比较所有4个子阵列并得到共同的元素。接下来,一次取3个子阵列并得到共同的元素。然后一次取2个子数组并得到RUBY中的公共元素。

1 个答案:

答案 0 :(得分:3)

这应该在最近的Ruby版本中完成:

a.length.downto(1).map{|i| a.combination(i).map{|sub| sub.inject(&:&)}}
#=> [[[]], [[], [3, 4], [2], [1]], [[3, 4], [2], [2, 3, 4], [1], [1, 3, 4], [1, 2]], [[2, 3, 4], [1, 3, 4], [1, 2], [1, 2, 3, 4]]]

Here's与类似解决方案相关的问题。 “技巧”在方法Array#&中,它计算两个数组的交集(作为设置操作)。这是associative操作,因此我们可以依次将它应用于每个子阵列,保持累积结果,因此inject是完美的。简而言之,array.inject(&:&)将导致array的每个成员中最常见的元素子集。 &:&只是一个Ruby简写,用于从名为Proc的方法中创建&并将其作为块提交给inject,而不是写入:

array.inject{|a,e| a & e}