• 如何跳出当前的多重循环?


    最近看到一个笔试题:
    如何跳出当前的多重循环?
    但是看到好多的答案:break,return,觉得这个答案似乎有些不妥

    于是仔细推导一番

    首先,不建议使用return跳出循环,题目也说到了是多重循环,
    如果使用return的话,会跳出整个函数,那后续的代码岂不是无法执行

    所以在这里,整理了一下自己的看法,
    目前了解到的一些循环有for,while,do while,switch
    下面一一说明
    public static void main(String[] args) {

    //使用break,或者标记break
    ok:for(int i=0;i<10;i++){
    System.out.println("xxx");
    for(int j=0;j<10;j++){
    if(j>2)
    break;//==return;
    System.out.println(j);
    }
    }
    这里需要说明的是,ok是用来标记跳出哪一个循环
    当ok标记在第一层(最外层)循环的时候,相当于return的功能,跳出整个循环
    "xxx"只会输出一次
    而当ok标记在第二层的时候,将相当于break的功能,只跳出当前的循环
    而"xxx"会在不执行第二层的情况下,完成第一层的循环
    for(int i=0;i<10;i++){
    System.out.println("xxx");
    ok:for(int j=0;j<10;j++){
    if(j>2)
    break ok;//==break;
    System.out.println(j);
    }
    }


    //使用自定义的boolean变量,配合循环条件一起共同满足方可执行循环
    //另外需要注意的时候,在跳出条件成立时,不仅设置flag的值,同时也要加上break


    这里需要说明的是,!flag是用来标记跳出哪一个循环
    当!flag标记在第一层(最外层)循环的时候,如果跳出条件成立,则会关闭第一层的循环
    相当于return;的功能
    boolean flag=false;
    for(int i=0;i<5&&!flag;i++){
    System.out.println("xxx");
    for(int j=0;j<5;j++){
    if(j>2){
    flag=true;break;
    //上面两句的功能等价于 return;
    }
    System.out.println(j);
    }
    }

    当!flag标记在第二层的时候,
    程序会先执行一次"xxx",然后再执行第二层循环,当跳出条件成立时,就关闭当前的循环
    而下一次循环时,只会执行第一层的循环,记住,这个!flag是关闭循环,而不是跳出
    boolean flag=false;
    for(int i=0;i<5;i++){
    System.out.println("xxx");
    for(int j=0;j<5&&!flag;j++){
    if(j>2){
    flag=true;
    break;
    }
    System.out.println(j);
    }
    }

    最后一种才是所谓的break,由一层循环开始,到第二层。
    当跳出条件成立,就跳出当前的循环,
    继而又从一层开始循环,在到第二层,又等到跳出条件成立,从一层开始
    周而复始
    for(int i=0;i<5;i++){
    System.out.println("xxx");
    for(int j=0;j<5;j++){
    if(j>2){
    break;
    }
    System.out.println(j);
    }
    }

    另外,对于while和switch都可使用标记,但是貌似switch目前还不会用boolean值做条件

    int i=0;
    ok:while(true){
    i++;
    System.out.println(i);
    if(i==5)
    break ok;
    }

    int i=0;
    boolean flag=false;
    while(true&&!flag){
    i++;
    System.out.println(i);
    if(i==5)
    flag=true;
    }


    int i=0;
    ok:do{
    i++;
    System.out.println(i);
    if(i==5)
    break ok;
    }while(true);

    int i=0;
    boolean flag=false;
    do{
    i++;
    System.out.println(i);
    if(i==5)
    flag=true;
    }while(true&&!flag);

    貌似 switch只能用标记吧
    int x=3;
    ok:switch(x){
    case 1:
    x*=10;
    break;
    case 2:
    x*=10;
    break;
    case 3:
    x*=10;
    break ok;
    case 4:
    x*=10;
    break;
    default:
    x=0;
    }
    System.out.println(x);

  • 相关阅读:
    665. Non-decreasing Array
    35. Search Insert Position
    CompositePattern(组合模式)-----Java/.Net
    BridgePattern(桥接模式)-----Java/.Net
    AdapterPattern(适配器模式)-----Java/.Net
    设计模式系列:原型模式(Prototype Pattern)
    设计模式系列:抽象工厂模式(Abstract Factory Pattern)
    设计模式系列:工厂方法模式(Factory Method Pattern)
    设计模式系列:简单工厂模式(Simple Factory Pattern)
    设计模式系列:单例模式(Singleton Pattern)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3067719.html
Copyright © 2020-2023  润新知