最近在面试的时候被人问到java中如何从内循环跳出外循环,当时没想出来,不过觉得挺有意思的,琢磨了一下,整理如下:
看下面一段代码:
public static void main(String[] args) {
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
System.out.println("i="+i+",j="+j);
if(i==j){
break;
}
}
}
}
正常执行的话,会输出如下结果:
i=0,j=0
i=1,j=0
i=1,j=1
i=2,j=0
i=2,j=1
i=2,j=2
i=3,j=0
i=3,j=1
i=3,j=2
i=3,j=3
i=4,j=0
i=4,j=1
i=4,j=2
i=4,j=3
i=4,j=4
i=5,j=0
i=5,j=1
i=5,j=2
i=5,j=3
i=5,j=4
i=5,j=5
i=6,j=0
i=6,j=1
i=6,j=2
i=6,j=3
i=6,j=4
i=6,j=5
i=6,j=6
i=7,j=0
i=7,j=1
i=7,j=2
i=7,j=3
i=7,j=4
i=7,j=5
i=7,j=6
i=7,j=7
i=8,j=0
i=8,j=1
i=8,j=2
i=8,j=3
i=8,j=4
i=8,j=5
i=8,j=6
i=8,j=7
i=8,j=8
i=9,j=0
i=9,j=1
i=9,j=2
i=9,j=3
i=9,j=4
i=9,j=5
i=9,j=6
i=9,j=7
i=9,j=8
i=9,j=9
内循环的break并没有退出外循环,这就达不到我们的目的。
项改进的话可以有三种办法:
一.给循环定义语句标签,java定义这个语句标签的目的好像就是为了用来表示循环,可能也是一种变相的实现goto语句的方法吧,修改后代码如下:
public static void main(String[] args) {
Out:
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
System.out.println("i="+i+",j="+j);
if(i==j){
break Out;
}
}
}
}
二.设置一个flag,在每次执行外循环的时候判断是不是需要跳出循环,在内循环里设置这个标记,相当于内循环通知外循环需要跳出就跳出,代码如下:
public static void main(String[] args) {
boolean stepOut = false;
for(int i=0;i<10;i++){
if (stepOut) {
break;
}
for(int j=0;j<10;j++){
System.out.println("i="+i+",j="+j);
if(i==j){
stepOut = true;
break;
}
}
}
}
三.把循环部分剥离出来成为一个独立的函数,在需要跳出循环时直接return(但是这种办法要考虑好返回值和传入参数的问题)代码如下:
public static void main(String[] args) {
getResult();
}
private static void getResult() {
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
System.out.println("i="+i+",j="+j);
if(i==j){
return;
}
}
}
}