7

嗨,我是 java 初学者,我的程序有 4 个 for 循环:我的程序是这样b工作 的for循环也会如此,我该怎么做?有break语句?truenn--ll++

for (int l = 0; l < n; l++) {
  for (int i = 1; i < (n - 2); i++) {
      for (int j = i + 1; j < (n - 1); j++) {
          for (int k = j + 1; k < n; k++) {
              if (l != i && l != j && l != k) {
                  boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
                  System.out.println(b);
                  if (b == true) {
                      pointList.remove(pointList.get(l);
                      n--;
                      break;
                  }
                  else
                      System.out.println(b);
              }
           }
       }
    }
}
4

9 回答 9

17

您可以将标记的中断用作:

      for (int l = 0; l < n; l++) {
 foo:    for (int i = 1; i < (n - 2); i++) {
            for (int j = i + 1; j < (n - 1); j++) {
                for (int k = j + 1; k < n; k++) {
                    if (l != i && l != j && l != k) {
                        boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
                        System.out.println(b);
                        if (b == true) {
                            pointList.remove(pointList.get(l);
                            n--;
                            break foo;
                        }
                        else
                            System.out.println(b);
                    }

                }

            }
        }
    }
于 2010-11-18T11:01:03.170 回答
5

在循环中,break语句终止内部循环,同时continue跳到下一次迭代。为了让这两个语句在与内部循环不同的循环上工作,您需要使用标签。像这样的东西应该工作:

outerloop:      
        for (int l = 0; l < n; l++) {
            for (int i = 1; i < (n - 2); i++) {
                for (int j = i + 1; j < (n - 1); j++) {
                    for (int k = j + 1; k < n; k++) {
                        if (l != i && l != j && l != k) {
                            boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
                            System.out.println(b);
                            if (b == true) {
                                pointList.remove(pointList.get(l);
                                n--;
                                continue outerloop;
                            }
                            else
                                System.out.println(b);
                        }

                    }

                }
            }
        }
于 2010-11-18T11:02:29.783 回答
3

查看带标签的 break 语句

例如这里:分支语句

于 2010-11-18T11:00:33.310 回答
3
String valueFromObj2 = null;
String valueFromObj4 = null;
OUTERMOST: for(Object1 object1: objects){
  for(Object2 object2: object1){
    //I get some value from object2
    valueFromObj2 = object2.getSomeValue();
    for(Object3 object3 : object2){
      for(Object4 object4: object3){
        //Finally I get some value from Object4.
        valueFromObj4 = object4.getSomeValue();
        //Compare with valueFromObj2 to decide either to break all the foreach loop
        if( compareTwoVariable(valueFromObj2, valueFromObj4 )) {
          break OUTERMOST;
        }
      }//fourth loop ends here
    }//third loop ends here
  }//second loop ends here
}//first loop ends here
于 2010-11-18T11:01:26.507 回答
2

使用带标签的循环

for (int l = 0; l < n; l++) {
    loopa:
    for (int i = 1; i < (n - 2); i++) {
        for (int j = i + 1; j < (n - 1); j++) {
            for (int k = j + 1; k < n; k++) {
                if (l != i && l != j && l != k) {
                    boolean b = isOK(pointList.get(l), pointList.get(i), pointList.get(j), pointList.get(k));
                    System.out.println(b);
                    if (b == true) {
                        pointList.remove(pointList.get(l);
                        n--;
                        break loopa;
                    }
                    else
                        System.out.println(b);
                }

            }

        }
    }
}

然后从标记的循环中中断

于 2010-11-18T11:02:31.710 回答
1
again:
for (int l = 0; l < n; l++) {
        for (int i = 1; i < (n - 2); i++) {
            for (int j = i + 1; j < (n - 1); j++) {
                for (int k = j + 1; k < n; k++) {
                    if (l != i && l != j && l != k) {
                        boolean b = isOK(pointList.get(l), pointList.get(i),  pointList.get(j), pointList.get(k));
                        System.out.println(b);
                        if (b == true) {
                            pointList.remove(pointList.get(l);
                            n--;
                            break again;
                        }
                        else
                            System.out.println(b);
                    }

                }

            }
        }
    }
于 2010-11-18T11:06:23.753 回答
1

我同意所有其他答案。但是,我想指出,另一种方法exit是将该代码放入其自己的例程中并使用return语句来打破整个过程。您的四重嵌套循环本身就非常复杂,以至于它可能无论如何都应该放在自己的例程中。

我从事的国防部工作要求任何一个例程的圈复杂度不超过 6(有一些例外)。仅这一系列循环就是 4 个。如果您找不到更简单的方法来执行此操作,那么您真的应该将它们扔到自己的例程中,以保持必须维护此代码的可怜笨蛋的理智。

于 2010-11-18T11:07:16.603 回答
0

第一个“快速而肮脏”的解决方案是使用stay_into_loops变量并修改for循环,例如:

 boolean stay_into_loops = true
 // here goes the first for loop
 for (int i = 1; i < (n - 2) && stay_into_loops ; i++) {
            for (int j = i + 1; j < (n - 1) && stay_into_loops ; j++) {
                for (int k = j + 1; k < n && stay_into_loops ; k++) {
                    if (l != i && l != j && l != k) {
                        boolean b = isOK(pointList.get(l), `pointList.get(i), pointList.get(j), pointList.get(k));`
                        System.out.println(b);
                        if (b == true) {
                            pointList.remove(pointList.get(l);
                            n--;
                            stay_into_loops = false;
                            break;

但是,当您遇到此类情况时,通常会产生代码异味。考虑重构代码,因为这会在某些时候升级为一团糟。

于 2010-11-18T11:01:31.493 回答
0

在每个内部 for 循环中为自己创建一个出口。
这是一个快速无痛的解决方案。

  bool breakout;
  for (int l = 0; l < n; l++) 
  {
        breakout = false;
        for (int i = 1; i < (n - 2) && !breakout; i++)
            for (int j = i + 1; j < (n - 1) && !breakout; j++)
                for (int k = j + 1; k < n && !breakout; k++)
                {
                    if(b == true)
                        breakout = true;                            
                }
  }

所以你看到breakout布尔值是你退出每个内部循环的票,因为它在每个for声明中都会被检查。并且每次第一次for迭代时都会重置。

于 2010-11-18T11:02:39.390 回答