2012-02-25 17 views
3

inputArray = Object[n][]を受け入れるJavaメソッドを作成したいと考えています。nは任意の整数で、n個のサブアレイのすべての値の間で可能なnサイズの組み合わせのリストを出力します。以下の例である:Javaのn個のサブアレイの値の組み合わせ

入力配列:(ここで、オブジェクト=文字列であり、n = 3)

String[] subarrayA = {"A0","A1","A2"}; 
String[] subarrayB = {"B0","B1"}; 
String[] subarrayC = {"C0","C1","C2","C3"}; 
String[3][] inputArray = {subarrayA, subarrayB, subarrayC}; 

所望の出力:明らか

{A0,B0,C0},{A0,B0,C1},{A0,B0,C2},{A0,B0,C3}, 
{A0,B1,C0},{A0,B1,C1},{A0,B1,C2},{A0,B1,C3}, 
{A1,B0,C0},{A1,B0,C1},{A0,B0,C2},{A1,B0,C3}, 
{A1,B1,C0},{A1,B1,C1},{A1,B1,C2},{A1,B1,C3}, 
{A2,B0,C0},{A2,B0,C1},{A2,B0,C2},{A2,B0,C3}, 
{A2,B1,C0},{A2,B1,C1},{A2,B1,C2},{A2,B1,C3} 

は、私は内部固定ネストされたループを有することができません私の方法はあらかじめnを知らないからです。だから、私はそれを再帰的な方法で解決する唯一の方法を推測していますか?どんな勧告?

P.S:私はウェブサイト上のシンプルなcombination-related postsを知っています。

+0

これは宿題ですか?何を試しましたか? – Scorpion

+1

いいえ、これは宿題ではありません。私はベイジアンネットワークのための事前確率表を作成しようとしています。これは「カテゴリ」の列しかないデータセットに基づいています。私は、オンザフライで与えられた列の値を持つSQLクエリを作成するための組み合わせが必要です。 – Rhubarb

+0

適切な数学的な言葉では、望ましい出力は、n個の入力セットの*デカルト積です。 (「n個のサブアレイのすべての値の間のnサイズの組み合わせ」にはおそらく{A0、A1、B0}も含まれます) – meriton

答えて

6

これは問題を解決するはずです。

public static void permute(String array[][], int index, ArrayList<String> output){ 

    if(index == array.length){ 
     System.out.println(output.toString()); 
    } 
    else{ 
     for(int i=0 ; i<array[index].length ; i++){ 
      output.add(array[index][i]); 
      permute(array,index+1,output); 
      output.remove(output.size() - 1); 
     } 
    } 
} 
+0

ありがとうございました。私はトレーニングによってプログラマーではなく、非常に直観的でない、すなわち難しい再帰を見つける。 – Rhubarb

+0

は、この複雑さはnCrのrに依存しますか? – LZH

+0

@JProgrammerこれがどのように機能するか説明できますか? 'output.remove(output.size() - 1);'が 'permute(array、index + 1、output);を呼び出した後に実行される方法は分かりません。 'permute()'を呼び出さないと 'output.remove()'が呼び出されないでしょうか? – enrique2334

関連する問題