2

假设我在一个数组中包含以下 ruby​​ 数组,但我不知道会有多少个数组或它们的长度。下面的一个例子:

[["cat", "dog"],[1, 3, 5, 7],["morning", "afternoon", "evening"]]

我想要做的是从每个数组中选择 1 个值并将其作为这些组合的数组返回结果的所有组合。因此,在以下示例中,应该有 2*4*3 或 24 个可能的唯一结果。

结果会是这样的:

result = [["cat", 1, "morning"], ["cat", 1, "afternoon"], ["dog", 5, "evening"] ...]

对于 N 个数组的列表,我将如何在 ruby​​ 中执行此操作?我试着弄乱产品、地图和注入,但我无法让它工作。

4

2 回答 2

4

编辑由于您明确表示您不仅要处理三个数组a1a2而且a3还要处理一个数组数组,因此将我的解决方案更改为使用product.

像这样?

 a1.map{|x1| a2.map{|x2| a3.map{|x3| [x1, x2, x3] }}}.flatten(2)

或与flat_map

 a1.flat_map{|x1| a2.flat_map{|x2| a3.map{|x3| [x1, x2, x3] }}}

哇,或者只是:

 a1.product(a2,a3)

如果您有多个数组(不仅仅是第一个示例中的固定数量 3),那么:

 input = [["cat", "dog"],[1, 3, 5, 7],["morning", "afternoon", "evening"]]
 h,*rest = input
 result = h.product(*rest)
于 2013-01-30T19:41:14.567 回答
3

数组#产品

xs[0].product(*xs.drop(1))

请注意,您更愿意编写Array.product(*xs),但 Ruby 在核心中没有这样的类方法(很容易编写,当然,但它可能应该存在)。

于 2013-01-30T19:49:24.820 回答