我有一个多维数组:
a=[[2,3,4],[1,3,4],[1,2],[1,2,3,4]]
我要比较所有4个子阵列并得到共同的元素。接下来,一次取3个子阵列并得到共同的元素。然后一次取2个子数组并得到RUBY中的公共元素。
答案 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}