2012-10-25 33 views
35

Nếu tôi có vòng lặp trong vòng lặp và một lần nếu câu lệnh được thỏa mãn, tôi muốn ngắt vòng lặp chính, tôi phải làm như thế nào?Làm thế nào để Break từ vòng lặp chính/bên ngoài trong một vòng lặp đôi/lồng nhau?

Đây là mã của tôi:

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

sử dụng nhãn. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html –

Trả lời

58

sử dụng nhãn nghỉ

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

Ngoài Xem

+0

Tuyệt vời! Tôi đã học được điều gì đó mới mẻ. Tôi nghĩ rằng nhãn được cho ngày trôi qua (nhớ GW-BASIC?).Tôi đã sử dụng cờ boolean cho việc này, nhưng các nhãn thì mát hơn nhiều! – ADTC

+0

@ADTC GW-BASIC không bao giờ hỗ trợ nhãn văn bản, chỉ có số dòng số (và yêu cầu những số này). IIRC, sắp ra khỏi Microsoft, đó là QuickBASIC hỗ trợ thêm cho các nhãn văn bản, cũng như các chương trình con được đặt tên. QBasic chắc chắn bao gồm hỗ trợ như vậy nếu Wikipedia là đáng tin cậy, ít nhất là không muộn hơn Visual Basic. –

12

Bạn chỉ có thể return điều khiển từ chức năng đó. Hoặc sử dụng phương pháp break labels xấu xí :) Nếu có một phần mã khác sau câu lệnh for của bạn, bạn có thể cấu trúc lại các vòng trong một hàm.

IMO việc sử dụng các ngắt và tiếp tục không được khuyến khích trong OOP, vì chúng ảnh hưởng đến khả năng đọc và bảo trì. Chắc chắn, có những trường hợp chúng tiện dụng, nhưng nói chung tôi nghĩ rằng chúng ta nên tránh chúng, vì chúng sẽ khuyến khích sử dụng lập trình kiểu goto.

Dường như các biến thể cho câu hỏi này được đăng rất nhiều, here Peter cung cấp một số sử dụng tốt và lẻ bằng cách sử dụng nhãn.

+2

Nguồn/bảo vệ khiếu nại của bạn rằng nhãn là xấu xí –

+5

Trong trường hợp cụ thể này, trả lại có thể thích hợp. Tuy nhiên nhãn không phải là xấu xí và thường hữu ích. –

+2

@JanDvorak Cảm ơn, xấu xí và khó gỡ lỗi. – dan

2

chỉ để cho vui

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

bình luận về break label: nó một goto về phía trước, nó có thể phá vỡ bất kỳ tuyên bố và nhảy đến tiếp theo:

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

//[1] 
+0

Lỗi cú pháp. Thiếu dấu chấm phẩy. –

+0

haha ​​:) Sẽ chắc chắn upvote cho tư duy sáng tạo này –

+2

Điều đó có vẻ nguy hiểm: o –

3

Hình như cho Java nghỉ ngơi nhãn dường như là con đường để đi (dựa trên sự đồng thuận của các câu trả lời khác). (? Nhất)

Nhưng đối với nhiều ngôn ngữ khác, hoặc nếu bạn muốn tránh bất kỳ goto như dòng điều khiển, bạn cần phải thiết lập một lá cờ:

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

Nếu ngắt được gắn nhãn thực sự là con đường để đi trong Java, sau đó con đường để đi trong C/C + + là một goto. –

+0

Ngoài ra, câu hỏi được dán nhãn rõ ràng là 'java'. –

+1

Không thay đổi thực tế rằng ai đó đang tìm kiếm 'ngắt vòng lặp lồng nhau' có thể xuất hiện trên đó. @EvanHarper Tôi sẽ đồng ý với dòng lý luận đó, nhưng tôi đã không dành nhiều thời gian trong Java nên chỉ cần đi với sự đồng thuận của các câu trả lời khác ... – Thymine

0

Phương pháp tốt nhất và dễ dàng cho người mới bắt đầu thậm chí

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; 
    } 
} 
Các vấn đề liên quan