2010-11-18 9 views
7

हाय मैं जावा में शुरुआत हूँ और मेरा कार्यक्रम छोरों के लिए 4 है: मेरा कार्यक्रम इस तरह से काम करता है कि अगर btrue है, तत्व pointList से निकाल दिया जाएगा और nn-- हो जाएगा और मैं सभी से बाहर जाने के लिए चाहते हैं लूप के लिए और लूप के लिए पहले से फिर से आते हैं तो ll++ होगा, मैं यह कैसे कर सकता हूं? ब्रेक स्टेटमेंट के साथ?हम लूप के लिए 4 आंतरिक से कैसे बाहर जा सकते हैं?

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

डुप्लिकेट http: // stackoverflow।कॉम/प्रश्न/551578/कैसे-टू-ब्रेक-एकाधिक-फ़ोरैच-लूप – SunnyShah

+0

शायद आप कुछ शब्दों में वर्णन कर सकते हैं कि आप क्या करना चाहते हैं? "अगर बी सत्य है तो एल-वें आइटम हटाएं"। आपके कोड में वाक्यविन्यास त्रुटियां हैं। इसे ठीक करें, कृपया, और अपने प्रश्न को स्पष्ट करें। – khachik

+0

ऐसा लगता है कि आप 4 मानदंडों को पूरा करने की कोशिश कर रहे हैं जो कुछ मानदंडों को पूरा करते हैं। यदि आपने समझाया कि मानदंड क्या था, तो शायद हम एक ही काम करने का एक आसान तरीका सुझा सकते हैं। जैसे शायद सूची को सॉर्ट करना शायद लूप को सरल बना सकता है। –

उत्तर

17

आप के रूप में एक लेबल को तोड़ने का उपयोग कर सकते हैं:

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

       } 

      } 
     } 
    } 
+0

यह भेस में एक गोटो है, है ना? :) – lorenzog

+0

यह लूप के लिए केवल अंतिम तीन तोड़ देगा और फिर यह पहले लूप के साथ शुरू होगा और उन तीनों के भीतर भी लूप के लिए चला जाएगा? – user472221

+1

मुझे लगता है कि आप किसी भी शाखाबद्ध कथन को "छिपाने में गेटो" मान सकते हैं। लेकिन उनके सभी की सीमाएं और उनके उपयोग हैं। यहां तक ​​कि गेटो भी करता है, वास्तव में (राज्य मशीन इसके बिना एक पिटा हैं)। –

3
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 
+0

http://stackoverflow.com/questions/551578/how-to-break-multiple-foreach-loop – SunnyShah

0

एक पहले 'त्वरित और गंदा' समाधान stay_into_loops चर का उपयोग करना होगा औरसंशोधित करना होगा 210 loops जैसे:

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; 

हालांकि यह आमतौर पर एक कोड गंध होता है जब आप इन चीजों का सामना करते हैं। कोड को दोबारा प्रतिक्रिया देने पर विचार करें क्योंकि यह किसी बिंदु पर गड़बड़ी में बढ़ जाएगा।

5

एक लूप में break कथन आंतरिक लूप को समाप्त करता है जबकि continue अगले पुनरावृत्ति पर छोड़ देता है। इन दो कथनों के लिए आंतरिक लूप पर एक अलग लूप पर काम करने के लिए आपको labels का उपयोग करने की आवश्यकता है। कुछ इस तरह काम करना चाहिए:

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

        } 

       } 
      } 
     } 
+0

से प्राप्त होने के साथ ही लिया गया है। धन्यवाद –

2

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

      } 

     } 
    } 
} 

एक लेबल पाश का उपयोग करें और फिर लेबल पाश

+0

यह लूप के लिए केवल अंतिम तीन तोड़ देगा और फिर यह पहले लूप के साथ शुरू होगा और उन तीनों के भीतर भी लूप के लिए चला जाएगा? – user472221

+0

मस्तिष्क से उस के बराबर समकक्ष। उसमें यह बाहरीतम लूप – stjohnroe

0

से तोड़ने के पाश के लिए प्रत्येक भीतरी में खुद के लिए एक निकास बनाएँ।
यहां एक त्वरित और दर्द रहित समाधान है।

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 बूलियन coz यह हर for घोषणा में जाँच हो जाता है, प्रत्येक भीतरी लूप से बाहर अपने टिकट है। और यह हर बार पहली for पुनरावृत्त रीसेट हो जाता है।

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

       } 

      } 
     } 
    } 
+0

के अगले पुनरावृत्ति में लाएगा, मुझे लगता है कि वह 'int (int l ...' लूप जारी रखना चाहता है और इससे बाहर नहीं निकलता है ... –

1

मैं अन्य सभी उत्तरों से सहमत हूं। हालांकि, मैं यह इंगित करना चाहता हूं कि exit का विकल्प केवल उस कोड को अपने दिनचर्या में रखना होगा और पूरी चीज़ को तोड़ने के लिए return कथन का उपयोग करना होगा। आपका क्वाड-नेस्टेड लूप स्वयं इतना जटिल है कि संभवतः यह संभवतः अपने स्वयं के दिनचर्या में होने का हकदार है।

मैंने डीओडी नौकरियों पर काम किया है जिसके लिए किसी भी एक दिनचर्या (कुछ अपवादों के साथ) के लिए 6 से अधिक की cyclomatic complexity की आवश्यकता है। अकेले लूप की यह श्रृंखला 4 है। यदि आपको ऐसा करने का एक आसान तरीका नहीं मिल रहा है, तो आपको वास्तव में उन गरीब schmucks की स्वच्छता को संरक्षित रखने के लिए उन्हें अपने नियमित रूप से चकना चाहिए जिन्हें इस कोड को बनाए रखना है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^