come possiamo uscire dai 4 cicli for interni?
-
26-09-2019 - |
Domanda
Ciao sono principiante in java e il mio programma ne ha 4 per i loop:il mio programma funziona così che if b
È true
, l'elemento verrà rimosso da pointList e n
sarà n--
e voglio uscire da tutti i cicli for e tornare dal primo ciclo for, quindi l
sarà l++
,come posso fare questo ?con l'istruzione break?
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);
}
}
}
}
}
Soluzione
Si può fare uso di una rottura etichettato come:
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);
}
}
}
}
}
Altri suggerimenti
In un ciclo dichiarazione break
termina il ciclo interno mentre continue
passa alla successiva iterazione. Affinché queste due affermazioni di lavorare su un circuito diverso da quello interno è necessario utilizzare etichette . Qualcosa del genere dovrebbe funzionare:
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);
}
}
}
}
}
Dai un'occhiata all'istruzione break etichettata
per esempio qui: Dichiarazioni di ramificazione
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
Utilizzare un ciclo etichettato
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 poi pausa dal ciclo etichettato
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);
}
}
}
}
}
Sono d'accordo con tutte le altre risposte. Tuttavia, vorrei far notare che in alternativa al exit
sarebbe di appena messo quel codice nella propria routine e utilizzare un'istruzione return
di uscire di tutta la faccenda. Il tuo ciclo quad-nested è così complessa da sé che probabilmente merita di essere nella propria routine di ogni caso.
Ho lavorato sui posti di lavoro del Dipartimento della Difesa che hanno richiesto un ciclomatica complessità di non più di 6 per qualsiasi routine uno (con alcune eccezioni). Questa serie di loop da solo è 4. Se non riesci a trovare un modo più semplice per farlo, si dovrebbe davvero buttare nella loro propria routine solo per preservare la sanità mentale dei poveri schmucks che devono mantenere questo codice.
Un primo 'rapido e sporco' soluzione sarebbe quella di utilizzare una variabile stay_into_loops
e modificare i loop for
come:
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;
Tuttavia è generalmente un codice odore quando si verificano cose come queste. Prendere in considerazione il refactoring del codice, perché questo degenerare in un pasticcio a un certo punto.
Crea un uscita per se stessi in ogni ciclo for interno.
Ecco una soluzione rapida e indolore.
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;
}
}
Così si vede il booleano breakout
è il vostro biglietto da ogni ciclo interno, coz viene controllato in ogni dichiarazione for
.
E diventa resettare ogni volta che le prime iterazioni for
.