为什么跳过这个for循环?

时间:2017-07-01 03:13:06

标签: java

在以下Java代码中:

public static void main(String[] args) {
    Integer[] k = new Integer[] {0, 1, 2, 3};

    int m = 0;
    while (m < k.length) {
        for (int i = 0; i < k.length && k[i] != null; i++)
            System.out.print(k[i] + " ");
        System.out.println("");
        k[m++] = null;
    }
}

我试图获得以下输出:

0 1 2 3
1 2 3
2 3
3

然而,在第一遍之后,即在0 1 2 3输出之后,内部for循环被完全跳过,并且因为第一次传递后第一个元素被设置为null,但是我不明白为什么重要,有人可以解释一下吗?真的很困惑。提前致谢。 :)

5 个答案:

答案 0 :(得分:1)

如果您使用i = m代替i=0,则可以使用。

    public static void main(String[] args) {
    Integer[] k =  new Integer[] {0, 1, 2, 3};

    int m = 0;
    while (m < k.length) {
        for (int i = m; i < k.length && k[i] != null; i++)
            System.out.print(k[i] + " ");
        System.out.println("");
        k[m++] = null;
    }

答案 1 :(得分:1)

尝试完成代码迭代 - 每次迭代并更新值:

让我们假装我们第一次达到了这行代码:

// Right now, (**before** the next line is executed), 
// `m` is still `0`, `k.length` is 4 (which is how we reached this point). 
// `i` is 0, which is less than `k.length`, and `k[i]` is `0`.

// This line sets `k[m]` to `null`, and then sets `m` to `m+1`.
k[m++] = null;   

// And now (**after** the above line is executed), `m` is 1, 
// `k.length` is still 4, so we get to go into the while loop for the second time. 
// At this point, `k: [null, 1, 2, 3]`.

在while循环中,我们再次遇到内循环,这是(这是我们第二次时间在这一行上):

// ...in the while loop for the second time...
// Remember, the k array now looks like: k: [null, 1, 2, 3]
for (int i = 0; i < k.length && k[i] != null; i++)

此时您的情况失败,原因是:

// Evaluating: i < k.length && k[i] != null
i < k.length // i: 0, k.length: 4, this is true
k[i] != null // i: 0 here, and k[0]: `null`, so this is false

true && false // returns false -> Don't go in the inner for-loop

答案 2 :(得分:0)

i < k.length && k[i] != null这使得for循环停止。您的索引(i)从0开始,因此在第二次循环时循环第一次时出现以下情况:

k = {null, 1, 2, 3}
m = 1

m < k.length = true

i = 0
i < k.length = true

// k = {null, 1, 2, 3}
// i = 0
// k[i] = k[0] = null
k[i] != null = false

答案 3 :(得分:0)

我不明白你为什么不使用两个for循环,它有点清楚:

public static void main(String[] args) {
    Integer[] k = new Integer[] {0, 1, 2, 3};

    for (int m = 0; m < k.length; m++) {
        for (int i = 0; i < k.length && k[i] != null; i++) {
            System.out.print(k[i] + " ");
        }
        System.out.println("");
        k[m] = null;
    }
}

问题陈述是你的内循环,它会检查k[i] != nullfor循环的第二个语句是终止条件。如果它返回false,则循环结束。从本质上讲,如果值为null,则您尝试不打印值,但这只会在达到空值时终止循环。相反,检查内循环内元素的条件:

for (int i = 0; i < k.length; i++) {
    if (k[i] != null) {
        System.out.print(k[i] + " ");
    }
}

此外,您甚至可以使用此内部循环(int i = m)而不是设置为null来基于当前索引跳过,因此第二次迭代为1-3,第三次迭代为2-3,等等。另外,使空检查/设置成为冗余,并允许您使用int[]。因此,最终的解决方案如下:

public static void main(String[] args) {
    int[] k = new int[] {0, 1, 2, 3};

    for (int m = 0; m < k.length; m++) {
        for (int i = m; i < k.length; i++) {
            System.out.print(k[i] + " ");
        }
        System.out.println("");
    }
}

答案 4 :(得分:0)

问题是由这些陈述引起的:

k[i] != null;

k[m++] = null;

如果将数组中的下一个元素设置为null,则for循环中的空检查条件将失败,并且循环将不会执行。

删除这两个语句并执行以下操作:

class Test {
    public static void main(String args[]) {
        int k[] = {0, 1, 2, 3};
        int m = 0;
        while (m < k.length) {
            for (int i = m; i < k.length; i++)
                System.out.print(k[i]);
            System.out.print("\n");
            m++;
        }
    }
}