アイテムのリスト{a、b、c、d}があり、可能なすべての組み合わせを生成する必要がある場合、
可能性を考えれば、
n=4, number of items
total #of combinations = 4C4 + 4C3 + 4C2 + 4C1 = 15
次の再帰的な方法を使用しました。
private void countAllCombinations (String input,int idx, String[] options) {
for(int i = idx ; i < options.length; i++) {
String output = input + "_" + options[i];
System.out.println(output);
countAllCombinations(output,++idx, options);
}
}
public static void main(String[] args) {
String arr[] = {"A","B","C","D"};
for (int i=0;i<arr.length;i++) {
countAllCombinations(arr[i], i, arr);
}
}
配列サイズが大きい場合、これを行うより効率的な方法はありますか?
組み合わせをバイナリシーケンスと見なし、4つすべてが存在する場合は1111を取得し、最初のアルファベットがない場合は0111を取得します。したがって、n個のアルファベットの場合は2 ^ n -1になります(0から含まれていません)組み合わせ。
これで、生成されたバイナリシーケンスで、コードが1の場合、要素は存在し、そうでない場合は含まれません。以下は同じものの実装です:-
String arr[] = { "A", "B", "C", "D" };
int n = arr.length;
int N = (int) Math.pow(2d, Double.valueOf(n));
for (int i = 1; i < N; i++) {
String code = Integer.toBinaryString(N | i).substring(1);
for (int j = 0; j < n; j++) {
if (code.charAt(j) == '1') {
System.out.print(arr[j]);
}
}
System.out.println();
}