2012-10-25 36 views
35

यदि मेरे पास लूप में लूप है और एक बार अगर कथन संतुष्ट हो जाए तो मैं मुख्य लूप तोड़ना चाहता हूं, मुझे ऐसा कैसे करना चाहिए?डबल/नेस्टेड लूप में मुख्य/बाहरी पाश से कैसे टूटा जाए?

यह मेरा कोड है:

for(int d = 0; d < amountOfNeighbors; d++){ 
     for(int c = 0; c < myArray.size(); c++){ 
      if(graph.isEdge(listOfNeighbors.get(d), c)){ 
       if(keyFromValue(c).equals(goalWord)){ // once this is true I want to break main loop. 
        System.out.println("We got to GOAL! It is "+ keyFromValue(c)); 
        break; // this breaks second loop not main one. 
       } 
      } 
     } 
    } 
+0

एक लेबल का उपयोग करें। http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html –

उत्तर

58

लेबल तोड़

mainloop: 
for(){ 
for(){ 
    if (some condition){ 
    break mainloop; 
    } 
    } 
} 

का उपयोग कर भी देखें

+0

बहुत बढ़िया! मैंने कुछ नया सीखा। मैंने सोचा था कि लेबल दिन बीत चुके थे (जीडब्ल्यू-बेसिक याद रखें?)।मैं इसके लिए बूलियन झंडे का इस्तेमाल करता, लेकिन लेबल बहुत कूलर होते हैं! – ADTC

+0

@ADTC GW-BASIC ने कभी भी पाठ्य लेबलों का समर्थन नहीं किया, केवल संख्यात्मक रेखा संख्याएं (और यह उनको आवश्यक है)। आईआईआरसी, माइक्रोसॉफ्ट से बाहर आ रहा था यह क्विकबासिक था जिसने पाठ के लेबल के साथ-साथ नामित सबराउटिन के लिए समर्थन जोड़ा। यदि विकिपीडिया पर भरोसा किया जाना है, तो कम से कम बाद में Visual Basic से QBasic में ऐसे समर्थन शामिल थे। –

27

आप अपने पाश के लिए लेबल जोड़ सकते हैं, और कहा कि labelled break उचित लूप से बाहर तोड़ने के लिए उपयोग करें: -

outer: for (...) { 
    inner: for(...) { 
     if (someCondition) { 
      break outer; 
     } 
    } 
} 

अधिक जानकारी के लिए इन लिंक देखें: -

12

आप उस फ़ंक्शन से केवल return पर नियंत्रण कर सकते हैं। या बदसूरत break labels दृष्टिकोण का उपयोग करें :) यदि आपके कथन के बाद कोई अन्य कोड भाग है, तो आप फ़ंक्शन में लूप को दोबारा कर सकते हैं।

आईएमओ ब्रेक का उपयोग और जारी रखने को ओओपी में निराश किया जाना चाहिए, क्योंकि वे पठनीयता और रखरखाव को प्रभावित करते हैं। निश्चित रूप से, ऐसे मामले हैं जहां वे आसान हैं, लेकिन आम तौर पर मुझे लगता है कि हमें उनसे बचना चाहिए, क्योंकि वे गेटो स्टाइल प्रोग्रामिंग के उपयोग को प्रोत्साहित करेंगे।

स्पष्ट रूप से इस प्रश्नों के लिए विविधताएं पोस्ट की गई हैं, here पीटर ने लेबल का उपयोग करके कुछ अच्छे और अजीब उपयोग प्रदान किए।

+2

स्रोत/अपने दावे की रक्षा करें कि लेबल बदसूरत हैं –

+5

इस विशेष मामले में, वापसी उचित हो सकती है। हालांकि लेबल बदसूरत और अक्सर उपयोगी नहीं हैं। –

+2

@JanDvorak धन्यवाद, बदसूरत और डीबग करने के लिए मुश्किल है। – dan

2
सिर्फ मनोरंजन के लिए

for(int d = 0; d < amountOfNeighbors; d++){ 
    for(int c = 0; c < myArray.size(); c++){ 
     ... 
      d=amountOfNeighbors; 
      break; 
     ... 
    } 
    // no code here 
} 

break label पर टिप्पणी: यह एक आगे गोटो, यह किसी भी बयान को तोड़ने और पर जा सकते हैं की अगली: जावा के लिए एक लेबल को तोड़ने के लिए प्रकट होता है जैसे

foo: // label the next statement (the block) 
{ 
    code ... 
    break foo; // goto [1] 
    code ... 
} 

//[1] 
+0

सिंटेक्स त्रुटि। एक अर्धविराम गुम है। –

+0

हाहा :) इस रचनात्मक सोच के लिए निश्चित रूप से उत्साहित होगा –

+2

यह खतरनाक लग रहा है: o –

3

लग रहा है जाने का रास्ता बनें (अन्य उत्तरों की सर्वसम्मति के आधार पर)। (? सबसे):

bool breakMainLoop = false; 
for(){ 
    for(){ 
     if (some condition){ 
      breakMainLoop = true; 
      break; 
     } 
    } 
    if (breakMainLoop) break; 
} 
+0

यदि लेबल वाला ब्रेक वास्तव में है जावा में जाने का तरीका, फिर सी/सी ++ में जाने का तरीका एक गोटो है। –

+0

इसके अलावा, प्रश्न स्पष्ट रूप से 'जावा' के रूप में लेबल किया गया है। –

+1

इस तथ्य को नहीं बदलेगा कि कोई 'ब्रेक नेस्टेड लूप' खोज रहा है, उस पर आ सकता है। @EvanHarper मैं तर्क की उस पंक्ति से सहमत हूं, लेकिन मैंने जावा में अधिक समय नहीं बिताया है, इसलिए बस अन्य उत्तरों की सर्वसम्मति से चला गया ... – Thymine

0

बेस्ट और आसान शुरुआती भी

के लिए तरीके

लेकिन कई के लिए अन्य भाषाओं, या अगर आप किसी भी goto नियंत्रण प्रवाह की तरह से बचना चाहते हैं, तो आप एक ध्वज सेट करने की जरूरत है

outerloop: 
for(int i=0; i<10; i++){ 
    // here we can break Outer loop by 
    break outerloop; 

innerloop: 
    for(int i=0; i<10; i++){ 
     // here we can break innerloop by 
     break innerloop; 
    } 
}