2017-09-25 93 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; 
}    

有人可以详细说明和解释第二个什么时候l OOP在干什么?

+0

“状态”的条目是指向“子集”的索引'表示来自构成当前组合的子阵列的字符串。第二个循环提前在'状态'的指数来挑选下一个组合 –

回答

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]是下一个最里面的索引(j)等,这线(内while环以上):

state[p]++; 

将递增state[0],由于p必须始终在这一点上是0(为了清晰起见,我认为它应该写成state[0]++)。现在,我们需要处理已经达到了极限,这是第二while循环做索引:

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

p==0开始,我们看到如果state[0]已经达到了极限(即k==sets[0].length嵌套for例子) 。如果有,我们通过将该索引重置为0(提前)模拟退出for循环,然后移出到下一个外部for循环。现在p==1,所以我们将在嵌套的for示例中递增state[1],即jstate[p]++增量j,然后我们回到while循环的顶部,看看j是否已达到其极限。如果是这样,我们做同样的事情 - 重置j为0,然后看看state[2]这相当于i,等等......