Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带字符串数组的组合数学_Java_Arrays_For Loop_While Loop - Fatal编程技术网

Java 带字符串数组的组合数学

Java 带字符串数组的组合数学,java,arrays,for-loop,while-loop,Java,Arrays,For Loop,While Loop,我找到了一个打印字符串所有组合的解决方案。以下代码的输出为: 丰田黑色轿车 本田黑色轿车 丰田红色轿车 本田红色轿车 丰田黑色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) { f

我找到了一个打印字符串所有组合的解决方案。以下代码的输出为:

丰田黑色轿车
本田黑色轿车
丰田红色轿车
本田红色轿车
丰田黑色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;  
}            
String[][]set=新字符串[][{{“丰田”、“本田”}、{“黑色”、“红色”}、{“轿车”、“suv”};
int[]state=newint[sets.length];
int p=0;
while(true){
for(int i=0;i

有人能详细解释一下第二个while循环在做什么吗?

状态在这里被用来模拟一个多重嵌套for循环。如果您知道
集合中有3个集合
,您可以通过以下方法来实现这一点

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]
        }
    }
}
将递增
状态[0]
,因为此时
p
必须始终为0(为了清晰起见,我认为应该将其写入
状态[0]+
)。现在我们需要处理已经达到极限的索引,这就是第二个
while
循环所做的:

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

p==0
开始,我们查看
状态[0]
是否已达到其极限(即
k==set[0]。嵌套
示例中的长度
)。如果有,我们模拟退出
for
循环,将该索引重置为0(提前),然后移动到下一个外部
for
循环。现在
p==1
,因此我们将增加
状态[1]
,它在嵌套的
示例中是
j
<代码>状态[p]+
递增
j
,然后我们返回
while
循环的顶部,查看
j
是否已达到其极限。如果是这样,我们做同样的事情——将
j
重置为0,然后查看与
i
等价的
state[2]
,依此类推……

state
的条目是
集合
子数组的索引,这些子数组表示构成当前生成的组合的那些子数组中的字符串。第二个循环在
状态下推进索引
,以选择下一个组合
while(state[p] == sets[p].length) {
    state[p] = 0;
    p++; 
    if (p == sets.length) return;
    state[p]++;
}