как мы можем выйти из 4 внутренних петель? - PullRequest
7 голосов
/ 18 ноября 2010

Привет Я новичок в Java, и моя программа имеет 4 цикла: моя программа работает следующим образом: если b равно true, элемент будет удален из pointList, а n будет n--, и я хочу выйти из всех циклов for и снова прийти из первого цикла for так что l будет l++, как я могу это сделать? с заявлением на перерыв?

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);
              }
           }
       }
    }
}

Ответы [ 9 ]

17 голосов
/ 18 ноября 2010

Вы можете использовать помеченный перерыв как:

      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);
                    }

                }

            }
        }
    }
5 голосов
/ 18 ноября 2010

В цикле оператор 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);
                        }

                    }

                }
            }
        }
3 голосов
/ 18 ноября 2010
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
3 голосов
/ 18 ноября 2010

Посмотрите на помеченный оператор разрыва

, например, здесь: Ветвящиеся операторы

2 голосов
/ 18 ноября 2010

Используйте помеченную петлю

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);
                }

            }

        }
    }
}

, а затем оторваться от маркированной петли

1 голос
/ 18 ноября 2010

Я согласен со всеми остальными ответами.Тем не менее, я хотел бы отметить, что альтернативой exit было бы просто поместить этот код в свою собственную подпрограмму и использовать оператор return, чтобы вырваться из всего этого.Ваш четырехуровневый цикл сам по себе настолько сложен, что, вероятно, в любом случае заслуживает того, чтобы быть в своей собственной рутине.

Я работал над заданиями DoD, для которых требовалась цикломатическая сложность не более6 для любой рутины (за некоторыми исключениями).Эта серия циклов одна - 4. Если вы не можете найти более простой способ сделать это, вам действительно следует бросить их в их собственную рутину, чтобы сохранить здравомыслие бедных чмоков, которым приходится поддерживать этот код.

1 голос
/ 18 ноября 2010
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);
                    }

                }

            }
        }
    }
0 голосов
/ 18 ноября 2010

Создайте выход для себя в каждом внутреннем цикле 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 повторяется.

0 голосов
/ 18 ноября 2010

Первым «быстрым и грязным» решением было бы использование переменной 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;

Однако, когда вы сталкиваетесь с подобными вещами, это, как правило, запах кода. Подумайте над рефакторингом кода, потому что в какой-то момент он превратится в беспорядок.

...