我想编写一个 Java 方法来操作如下:
输入 1,输出 { {0},{1} } 输入 2,输出 { {0, 0}, {0, 1}, {1, 0}, {1, 1} } 输入 3,输出 { {0, 0, 0}, {0, 0, 1}, {0, 1, 0}, ... {1, 1, 1} } ...
(为了简洁,我在示例中使用 0 和 1;最低级别的子元素可能是 HIGH 和 LOW、'A' 和 'Z',或任何其他两个不同的值。)
这感觉像是一个很好的递归候选者,但这只是一种感觉。到目前为止,我所有的努力似乎都不是最理想的。* 除了使用不同的语言之外,还有什么好的方法吗?
* 例如:循环 0 到 (2^input)-1;将数字解释为 [输入] 位二进制值;使用二进制数字生成子数组。呸。
编辑:提出广义迭代解决方案
公共枚举项{ 第 1 项,第 2 项,...;// 需要多少 私有静态最终 int ITEM_COUNT = values().length; 公共静态项目[][] allCombinationsOfSize(int comboSize) { int arraySize = (int) Math.pow(ITEM_COUNT, comboSize); 项目数组[][] = 新项目[arraySize][]; for (int n = 0 ; n < arraySize ; ++n ) { 数组[n] = nthSubarray(n, comboSize); } 返回数组; } 私有静态项目 [] nthSubarray(int n, int comboSize) { 项目组合[] = 新项目[comboSize]; for (int i = comboSize - 1 ; i >= 0 ; --i ) { 组合[i] = Item.values()[n % ITEM_COUNT]; n /= ITEM_COUNT; } 返回组合; } }
我相信 allCombinationsOfSize 是我正在寻找的方法。我仍然有一个偷偷摸摸的怀疑,我错过了一些更优雅的东西。尽管如此,以上内容允许我在我的 JUnit 测试中编写它......
对于(信号信号[]:Signal.allCombinationsOfSize(pinCount)){ 断言等于( cls.getSimpleName() + "结果", 预期结果(cls,信号), actualResultFor(cls, 信号) ); }
...这很简单。