سؤال

مرحبًا ، أنا مبتدئ في Java وبرنامجي لديه 4 لحلقات: يعمل برنامجي مثل هذا إذا b هو true ، ستتم إزالة العنصر من قائمة النقاط و 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. إذا لم تتمكن من إيجاد طريقة أبسط للقيام بذلك ، يجب عليك حقًا أن تشاكهم في روتينهم الخاص فقط للحفاظ على عقل الفقراء الذين يتعين عليهم الحفاظ على هذا الرمز.

أول حل "سريع وقذر" هو استخدام أ 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 هي تذكرتك من كل حلقة داخلية ، حيث يتم فحصها في كل شيء for تصريح. ويتم إعادة تعيينه في كل مرة الأولى for يكرر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top