在以下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,但是我不明白为什么重要,有人可以解释一下吗?真的很困惑。提前致谢。 :)
答案 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] != null
。 for
循环的第二个语句是终止条件。如果它返回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++;
}
}
}