次のような操作を行う 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」、またはその他の 2 つの異なる値である可能性があります。)
これは再帰の良い候補のように思えますが、それは現時点では単なる感覚です。これまでの私の努力はすべて最適とは言えませんでした。* 別の言語を使用する以外に、良いアプローチについて何か考えはありますか?
* 例: 0 から (2^input)-1 までループします。数値を [入力] 桁のバイナリ値として解釈します。2 進数を使用して部分配列を生成します。ブレア。
編集:一般化された反復ソリューションを提示する
public enum アイテム {
ITEM1、ITEM2、...; // 必要なだけ
private static final int ITEM_COUNT = values().length;
public static Item[][] allCombinationsOfSize(intのコンボサイズ) {
int arraySize = (int) Math.pow(ITEM_COUNT,omboSize);
アイテム配列[][] = 新しいアイテム[配列サイズ][];
for ( int n = 0 ; n < 配列サイズ ; ++n ) {
array[n] = nthSubarray(n, コンボサイズ);
}
配列を返します。
}
private static Item[] nthSubarray(int n, int コンボサイズ) {
アイテムのコンボ[] = 新しいアイテム[コンボサイズ];
for ( int i = コンボサイズ - 1 ; i >= 0 ; --i ) {
コンボ[i] = Item.values()[n % ITEM_COUNT];
n /= ITEM_COUNT;
}
リターンコンボ;
}
}
allCombinationsOfSize が探している方法だと思います。私はまだ、もっとエレガントなものを見逃しているのではないかとこっそり疑っています。それにもかかわらず、上記により、JUnitテストでこれを書くことができます...
for ( 信号信号[] : Signal.allCombinationsOfSize(pinCount) ) {
assertEquals(
cls.getSimpleName() + "結果",
expectedResultFor(cls、シグナル)、
actualResultFor(cls、シグナル)
);
}
...これはかなり簡単です。