Как мы можем выйти из 4 внутренних петлей?
-
26-09-2019 - |
Вопрос
Привет, я новичок в Java, и моя программа имеет 4 для циклов: моя программа работает так, что если b
является true
Элемент будет удален с Pointlist и n
будет n--
и то я хочу выйти из всех петлей и прийти снова с первого для петли так 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);
}
}
}
}
}
Решение
Вы можете использовать меченый перерыв как:
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);
}
}
}
}
}
Другие советы
В петле 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);
}
}
}
}
}
Посмотрите на меченное заявление о перерыве
Например, здесь: Развлекательные заявления
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
Используйте меченную петлю
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);
}
}
}
}
}
а затем перерываться от мечественной петли
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);
}
}
}
}
}
Я согласен со всеми остальными ответами. Тем не менее, я хотел бы отметить, что альтернативу exit
было бы просто поставить этот код в свою собственную рутину и использовать return
заявление, чтобы вырваться из всего этого. Ваша четырехъядерная петля настолько сложна сама по себе, что он, вероятно, заслуживает в любом случае, чтобы быть в своей собственной рутине.
Я работал на рабочих местах DoD, которая требовала цикломатическая сложность не более 6 для любой рутины (с некоторыми исключениями). Эта серия петель в одиночестве составляет 4. Если вы не можете найти более простой способ сделать это, вы действительно должны обмануть их в собственной рутине, просто чтобы сохранить здравомыслие бедных Schmucks, которые должны поддерживать этот код.
Первое «быстрое и грязное» решение было бы использовать 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;
Однако это, как правило, кодовый запах, когда вы столкнулись с такими вещами. Рассмотрим рефакторинг кода, потому что это будет обостриться в беспорядок в какой-то момент.
Создайте выход для себя в каждом внутренне для цикла.
Вот быстрое и безболезненное решение.
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
Boolean - это ваш билет из каждой внутренней петли, COZ это проверяется в каждом for
Декларация. И он сбрасывается каждый раз первым for
итерат.