我想要做的是处理n组,而我下面提供的代码恰好适用于4组.
def show_combinations
@combos = []
['A', 'no A'].each do |a|
['B', 'no B'].each do |b|
['C', 'no C'].each do |c|
['D', 'no D'].each do |d|
@combos << [a, b, c, d]
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
我如何重构以下代码来处理以下场景:鉴于我有一个大小为y的数组包含大小为n的数组,我想返回所有组合.重要的是要注意每个子数组中只有一个项目可以在结果中.(例如"已完成的配置文件"也不能出现在"未完成配置文件"的结果中)
背景:
用户可能有一些任务:例如,"完成配置文件"或"设置电子邮件"等等.这些任务可以表示如下:
@task_states = [["Completed Profile, NOT Completed Profile"], ["Set up Email", "NOT set up Email"]]
Run Code Online (Sandbox Code Playgroud)
然后,将@task_states传递给方法,结果应为:
[
["Completed Profile", "Set up Email"],
["Completed Profile", "NOT set up Email"],
["NOT Completed Profile", "Set up Email"],
["NOT Completed Profile", "NOT Set up Email"]
]
Run Code Online (Sandbox Code Playgroud)
所以表示所有组合的数组数组.显然,"已完成的配置文件"也不能与"未完成的配置文件"等在同一个数组中.
谢谢!
看起来你想要计算数组的笛卡尔积.计算笛卡尔积的方法(不太令人惊讶)称为Array#product:
@task_states.first.product(*@task_states.drop(1))
Run Code Online (Sandbox Code Playgroud)
所以,例如:
['A', 'no A'].product(['B', 'no B'], ['C', 'no C'], ['D', 'no D'])
#=> [[ "A", "B", "C", "D"],
# [ "A", "B", "C", "no D"],
# [ "A", "B", "no C", "D"],
# [ "A", "B", "no C", "no D"],
# [ "A", "no B", "C", "D"],
# [ "A", "no B", "C", "no D"],
# [ "A", "no B", "no C", "D"],
# [ "A", "no B", "no C", "no D"],
# ["no A", "B", "C", "D"],
# ["no A", "B", "C", "no D"],
# ["no A", "B", "no C", "D"],
# ["no A", "B", "no C", "no D"],
# ["no A", "no B", "C", "D"],
# ["no A", "no B", "C", "no D"],
# ["no A", "no B", "no C", "D"],
# ["no A", "no B", "no C", "no D"]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |