2

我有一个多维数组:

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

我必须比较所有 4 个子数组并获得共同元素。接下来,一次取 3 个子数组并获得共同元素。然后一次取 2 个子数组并获得共同元素,在 RUBY 中。

4

1 回答 1

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]]]

这是具有类似解决方案的相关问题。“技巧”在方法Array#&中,它计算两个数组的交集(作为集合操作)。它是关联操作,因此我们可以将它依次应用于每个子数组,保留累积的结果,因此inject非常适合它。简而言之,array.inject(&:&)将导致array. &:&只是一个 Ruby 简写,用于制作一个Proc名为 out 的方法&并将其作为一个块提交给inject,而不是编写:

array.inject{|a,e| a & e}
于 2010-04-06T13:07:09.623 回答