2017-09-25 14 views
1

文字列のすべての組み合わせを出力するソリューションが見つかりました。文字列配列を持つコンビナトリアル

トヨタブラックセダン
ホンダブラックセダン
トヨタ赤セダン
ホンダ赤セダン
トヨタブラックSUV
ホンダブラックSUV
トヨタ赤SUV
ホンダ赤:以下のコードは、の出力を有することになりますsuv

String[][] sets = new String[][] {{"Toyota", "Honda"}, {"black", "red"}, {"sedan", "suv"}}; 
int[] state = new int[sets.length]; 
int p = 0; 
while (true) { 
    for (int i = 0; i < state.length; i++) { 
     System.out.print(sets[i][state[i]] + " "); 
    } 

    System.out.println(); 
    state[p]++; 

    while(state[p] == sets[p].length) { 
     state[p] = 0; 
     p++; 
     if (p == sets.length) return; 
     state[p]++; 
    } 
    p = 0; 
}    

誰かが精緻化し、 oopはやっている?

+0

'state'のエントリは' sets '現在のコンビネーションを構成するサブアレイからの文字列が生成されていることを示します。 2番目のループは 'state'のインデックスを進め、次の組み合わせを選び出します –

答えて

1

stateここでは、複数のネストされたforループをシミュレートするために使用されています。あなたは3セットがsetsであったことを知っていたならば、あなたは

for (int i = 0; i < sets[2].length; i++) { 
    for (int j = 0; j < sets[1].length; j++) { 
     for (int k = 0; k < sets[0].length; k++) { 
      // form output from sets[0][k], sets[1][j], sets[2][i] 
     } 
    } 
} 

のようなものでこれを達成することができしかし、これはあなたが必要がありますどのように多くのインデックスがわからないときは動作しません。

stateアレイは、ネストされたforループのすべてのインデックスを保持します。 state[0]最も内側の指標(上記の例でk)、state[1]は(内側whileループ上)この行の次の最内側のインデックス(j)、等である。pが常になければならないので

state[p]++; 

は、state[0]をインクリメントしますこの時点で0になります(わかりやすくするためにstate[0]++と書かれているはずです)。 state[0]が限界(ネストされたfor例ではすなわちk==sets[0].length)に達した場合

while(state[p] == sets[p].length) { 
    state[p] = 0; 
    p++; 
    if (p == sets.length) return; 
    state[p]++; 
} 

p==0から始めて、我々は以下を参照してください。今、私たちは、第二whileループが何をするかで自分の限界に達したインデックスが処理する必要があります。存在する場合は、forのループを終了してそのインデックスを0にリセットしてから、次の外側のforループに移動してシミュレートします。今度はp==1なので、入れ子になったforの例では、がjになります。 state[p]++がインクリメントjになると、が上限に達したかどうかを確認するために、whileループの先頭に戻ります。そうであれば、我々は同じことをする - jを0にリセットし、次にiと等価であるstate[2]を見てください。

関連する問題