获取k长度数组的k-1长度子集数组

时间:2012-09-06 12:30:27

标签: ruby arrays multidimensional-array

  

可能重复:
  ruby array element grouping

实施例。给定数组a:

a = [1, 2, 3]

它的长度是3所以我想要打印所有2长度的数组。这些是:

[1, 2]
[1, 3]
[2, 3]

我不知道Ruby中是否有一些方法可以获取子集数组。如果没有这样的方法,最有效的方法是实现这一目标。

1 个答案:

答案 0 :(得分:5)

这只是2个元素的简单combination

 >> xs = [1, 2, 3]
 >> xs.combination(xs.size - 1).to_a
 => [[1, 2], [1, 3], [2, 3]]

[编辑]正如@Joshua在评论中指出的那样,文档声明订单不能保证(!)。所以这是一个功能实现,它按照您要求的顺序生成组合。为了完整起见,我会将其作为原始combination方法使其变得懒惰:

require 'enumerable/lazy'

class Array
  def combinations_of(n)
    if n == 0
      [[]].lazy
    else
      0.upto(self.size - 1).lazy.flat_map do |idx|
        self.drop(idx + 1).combinations_of(n - 1).map do |xs| 
          [self[idx]] + xs
        end
      end    
    end
  end
end