Como podemos sair do 4 interno para loops?
-
26-09-2019 - |
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);
}
}
}
}
}
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.