Pergunta

Oi eu sou iniciante em java e meu programa tem 4 para loops: meu programa funciona assim se se b é true , o elemento será removido da Pointlist e n vai ser n-- E eu quero sair de todos por loops e voltar do primeiro para o loop, então l vai ser l++,como posso fazer isso ? com declaração de quebra?

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);
              }
           }
       }
    }
}
Foi útil?

Solução

Você pode usar uma pausa rotulada como:

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

                }

            }
        }
    }

Outras dicas

Em um loop o break a declaração encerra o loop interno enquanto continue pula para a próxima iteração. Para que essas duas declarações trabalhem em um loop diferente para o interno que você precisa usar Rótulos. Algo assim deve funcionar:

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

                    }

                }
            }
        }

Dê uma olhada na declaração de interrupção rotulada

por exemplo aqui: Declarações de ramificação

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

Use um loop rotulado

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

            }

        }
    }
}

e depois quebre do loop rotulado

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

                }

            }
        }
    }

Eu concordo com todas as outras respostas. No entanto, gostaria de ressaltar que uma alternativa a exit seria apenas colocar esse código em sua própria rotina e usar um return declaração para sair da coisa toda. Seu loop de aninhado quad é tão complexo por si só que provavelmente merece estar em sua própria rotina de qualquer maneira.

Eu trabalhei em trabalhos do Departamento de Defesa que exigiam um complexidade ciclomática de não mais que 6 para qualquer rotina (com algumas exceções). Somente esta série de loops é 4. Se você não conseguir encontrar uma maneira mais simples de fazê -lo, realmente deve jogá -los em sua própria rotina apenas para preservar a sanidade dos pobres schmucks que precisam manter esse código.

Uma primeira solução 'rápida e suja' seria usar um stay_into_loops variável e modificar o for Loops como:

 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;

No entanto, geralmente é um cheiro de código quando você encontra coisas como essas. Considere refatorar o código porque isso se transformará em uma bagunça em algum momento.

Crie uma saída para si mesmo em cada interior para loop.
Aqui está uma solução rápida e indolor.

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

Então você vê o breakout Boolean é o seu ingresso de cada loop interno, porque ele é verificado em cada for declaração. E é redefinido toda vez que o primeiro for itera.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top