level 6
Prezi_暗流
楼主
事情起因是这样的,需要判断一幅图里是否存在某颜色的点,用的是i<width, j<height的嵌套for遍历循环所有像素,只要找到第一个这样颜色的点后即退出两层的for循环。但如何实现”随时退出循环”这一点呢,Google了一番,总结出如下方法。
一)两个易误解的函数:
1. noLoop(): 这个函数会让整个voiddraw()停下来,跟我上面说的想达到的目的无关;
2. exit(): 这个更狠,直接让整个画布退出,相当于摁了代码窗口上的停止(方块图标)按钮;
二)具体实现方法:
1. 用while循环:
boolean found = false;
while (!found){
……;
//找到结果之后
found = true;
}
不过貌似这方法不太适用于双层for嵌套循环。
2. 用for循环加上个是非判断:
boolean found = false;
for (int i = 0; !found && i<10; i++){
……;
//找到结果之后
found = true;
}
3. break才是正解啊:
for (int i = 0;i < 5; i++){
for (int j = 0; j < 5; j++){
println("i: " + i + ", j:" + j + " -> " + (i + j));
if (i + j == 5) {
break;
}
}
}
控制台打印结果是这样的:
i: 0, j: 0 ->0
i: 0, j: 1 ->1
i: 0, j: 2 ->2
i: 0, j: 3 ->3
i: 0, j: 4 ->4
i: 1, j: 0 ->1
i: 1, j: 1 ->2
i: 1, j: 2 ->3
i: 1, j: 3 ->4
i: 1, j: 4 ->5
i: 2, j: 0 ->2
i: 2, j: 1 ->3
i: 2, j: 2 ->4
i: 2, j: 3 ->5
i: 3, j: 0 ->3
i: 3, j: 1 ->4
i: 3, j: 2 ->5
i: 4, j: 0 ->4
i: 4, j: 1 ->5
可以看到,此时是跳出了j 的循环,但是i 循环还没有停。
4. 此时,给break再加个标签,就可以同时退出两个循环啦:
getOut: //锚定标签位置,要在两个for之前
for (inti = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
println("i: " + i + ", j:" + j + " -> " + (i + j));
if (i + j == 5) {
break getOut; //退出到刚才的锚定点位置
}
}
}
这回打印出来的就短多了:
i: 0, j: 0 -> 0
i: 0, j: 1 -> 1
i: 0, j: 2 -> 2
i: 0, j: 3 -> 3
i: 0, j: 4 -> 4
i: 1, j: 0 -> 1
i: 1, j: 1 -> 2
i: 1, j: 2 -> 3
i: 1, j: 3 -> 4
i: 1, j: 4 -> 5
同时跳出多个循环,就酱。
2014年05月28日 10点05分
1
一)两个易误解的函数:
1. noLoop(): 这个函数会让整个voiddraw()停下来,跟我上面说的想达到的目的无关;
2. exit(): 这个更狠,直接让整个画布退出,相当于摁了代码窗口上的停止(方块图标)按钮;
二)具体实现方法:
1. 用while循环:
boolean found = false;
while (!found){
……;
//找到结果之后
found = true;
}
不过貌似这方法不太适用于双层for嵌套循环。
2. 用for循环加上个是非判断:
boolean found = false;
for (int i = 0; !found && i<10; i++){
……;
//找到结果之后
found = true;
}
3. break才是正解啊:
for (int i = 0;i < 5; i++){
for (int j = 0; j < 5; j++){
println("i: " + i + ", j:" + j + " -> " + (i + j));
if (i + j == 5) {
break;
}
}
}
控制台打印结果是这样的:
i: 0, j: 0 ->0
i: 0, j: 1 ->1
i: 0, j: 2 ->2
i: 0, j: 3 ->3
i: 0, j: 4 ->4
i: 1, j: 0 ->1
i: 1, j: 1 ->2
i: 1, j: 2 ->3
i: 1, j: 3 ->4
i: 1, j: 4 ->5
i: 2, j: 0 ->2
i: 2, j: 1 ->3
i: 2, j: 2 ->4
i: 2, j: 3 ->5
i: 3, j: 0 ->3
i: 3, j: 1 ->4
i: 3, j: 2 ->5
i: 4, j: 0 ->4
i: 4, j: 1 ->5
可以看到,此时是跳出了j 的循环,但是i 循环还没有停。
4. 此时,给break再加个标签,就可以同时退出两个循环啦:
getOut: //锚定标签位置,要在两个for之前
for (inti = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
println("i: " + i + ", j:" + j + " -> " + (i + j));
if (i + j == 5) {
break getOut; //退出到刚才的锚定点位置
}
}
}
这回打印出来的就短多了:
i: 0, j: 0 -> 0
i: 0, j: 1 -> 1
i: 0, j: 2 -> 2
i: 0, j: 3 -> 3
i: 0, j: 4 -> 4
i: 1, j: 0 -> 1
i: 1, j: 1 -> 2
i: 1, j: 2 -> 3
i: 1, j: 3 -> 4
i: 1, j: 4 -> 5
同时跳出多个循环,就酱。