【问题标题】:combinatorics with string array与字符串数组的组合
【发布时间】:2018-03-05 22:42:51
【问题描述】:

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

丰田黑色轿车
本田黑色轿车
丰田红色轿车
本田红色轿车
丰田黑色 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;  
}            

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

【问题讨论】:

  • state 的条目是sets 的子数组的索引,表示来自那些子数组的字符串,这些子数组构成了正在生成的当前组合。第二个循环推进state 中的索引以挑选下一个组合

标签: java arrays for-loop while-loop


【解决方案1】:

state 在这里用于模拟多重嵌套的 for 循环。如果您知道sets 中有 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]
        }
    }
}

但是,当您不知道需要多少索引时,这不起作用。

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 示例中的k==sets[0].length)。如果有,我们通过将该索引重置为 0(提前)来模拟退出该 for 循环,然后移至下一个外部 for 循环。现在是p==1,所以我们将递增state[1],即嵌套for 示例中的j。 state[p]++ 递增j,然后我们回到while 循环的顶部,看看j 是否已达到其极限。如果是这样,我们做同样的事情——将j重置为0,然后看state[2]相当于i,以此类推……

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2011-08-08
    相关资源
    最近更新 更多