Bagaimana cara keluar dari loop bersarang di Jawa?


1819

Saya memiliki konstruk nested loop seperti ini:

for (Type type : types) {
    for (Type t : types2) {
         if (some condition) {
             // Do something and break...
             break; // Breaks out of the inner loop
         }
    }
}

Sekarang bagaimana saya bisa keluar dari kedua loop? Saya telah melihat pertanyaan serupa, tetapi tidak ada yang berhubungan dengan Jawa secara khusus. Saya tidak bisa menerapkan solusi ini karena kebanyakan goto digunakan.

Saya tidak ingin meletakkan loop dalam metode yang berbeda.

Saya tidak ingin memutarkan loop. Ketika melanggar saya selesai dengan eksekusi blok loop.

Jawaban:


2427

Seperti penjawab lain, saya pasti lebih suka untuk menempatkan loop dalam metode yang berbeda, pada titik mana Anda bisa kembali untuk berhenti iterasi sepenuhnya. Jawaban ini hanya menunjukkan bagaimana persyaratan dalam pertanyaan dapat dipenuhi.

Anda dapat menggunakan breaklabel untuk loop luar. Sebagai contoh:

public class Test {
    public static void main(String[] args) {
        outerloop:
        for (int i=0; i < 5; i++) {
            for (int j=0; j < 5; j++) {
                if (i * j > 6) {
                    System.out.println("Breaking");
                    break outerloop;
                }
                System.out.println(i + " " + j);
            }
        }
        System.out.println("Done");
    }
}

Ini mencetak:

0 0
0 1
0 2
0 3
0 4
1 0
1 1
1 2
1 3
1 4
2 0
2 1
2 2
2 3
Breaking
Done

286
Ini tidak langsung melompat setelah loop. Cobalah! Ya, labelnya ada sebelum loop, tapi itu karena itu label loop, daripada tempat Anda ingin keluar. (Anda dapat melanjutkan dengan label juga.)
Jon Skeet

2
Perl juga mengizinkan sistem labelnya sendiri. Saya pikir banyak bahasa - tidak mengejutkan saya bahwa itu di Jawa.
Evan Carroll

9
@Van - klaim itu jelas benar - dalam bahasa yang menjanjikan itu benar. Tetapi Java tidak membuat janji itu. Jika suatu bahasa bertentangan dengan asumsi Anda, ada kemungkinan bahwa asumsi Anda yang salah. Dalam hal ini, saya pikir Anda masih sebagian benar - prinsip paling tidak mengejutkan. Banyak orang yang belum pernah mendengar (atau melupakan) bentuk itu break. Bahkan kemudian, pengecualian adalah pengecualian lain yang lebih dikenal (maaf). Tapi saya masih tidak senang dengan hal ini jika tidak jelas (loop kecil, peringatan komentar jika label / break masih tidak cukup terlihat).
Steve314

6
@MuhammadBabar: outerloopadalah label. Saya tidak tahu persis kode apa yang Anda coba, tetapi kode dalam jawaban saya mengkompilasi dan berjalan dengan baik.
Jon Skeet

4
@NisargPatil Hanya karena di sonarLint tidak membuatnya menjadi bau kode. Itu hanya berarti ada pengembang yang menambahkan ini ke sonarLint dengan gatal pribadi untuk menggaruk, dan itu penuh dengan aturan semacam ini yang hanya masuk akal ketika disalahgunakan, atau karena beberapa pengembang memiliki perang benci pribadi terhadap mereka. Istirahat berlabel dan berlanjut adalah cara yang sangat elegan untuk menggambarkan apa yang ingin Anda lakukan.
john16384

403

Secara teknis jawaban yang benar adalah memberi label lingkaran luar. Dalam prakteknya jika Anda ingin keluar pada suatu titik di dalam loop batin maka Anda akan lebih baik mengeksternalisasi kode menjadi metode (metode statis jika perlu) dan kemudian menyebutnya.

Itu akan membayar untuk keterbacaan.

Kode akan menjadi seperti itu:

private static String search(...) 
{
    for (Type type : types) {
        for (Type t : types2) {
            if (some condition) {
                // Do something and break...
                return search;
            }
        }
    }
    return null; 
}

Cocok dengan contoh untuk jawaban yang diterima:

 public class Test {
    public static void main(String[] args) {
        loop();
        System.out.println("Done");
    }

    public static void loop() {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (i * j > 6) {
                    System.out.println("Breaking");
                    return;
                }
                System.out.println(i + " " + j);
            }
        }
    }
}

30
Kadang-kadang Anda menggunakan beberapa variabel lokal yang berada di luar lingkaran dalam, melewati semuanya bisa terasa kikuk.
Haoest

1
Jadi bagaimana solusi ini seharusnya mencetak "Selesai" seperti pada jawaban yang diterima?
JohnDoe

1
@ JohnApakah Anda menyebutnya dan kemudian Anda mencetak System.out.println ("selesai"); coba {} akhirnya {} dalam metode pencarian juga merupakan opsi.
Zo72

2
Saya rasa ini adalah latihan yang lebih baik, tetapi apa yang terjadi jika Anda ingin melanjutkan alih-alih melanggar? Label mendukung dengan baik (atau buruk!) Tapi saya tidak yakin bagaimana cara mengubah logika ini untuk melanjutkan.
Rob Grant

@RobertGrant Jika Anda ingin melanjutkan alih-alih istirahat, pindahkan loop luar di luar loopmetode dan kembali dari metode untuk melanjutkan.
Muhd

215

Anda dapat menggunakan blok bernama di sekitar loop:

search: {
    for (Type type : types) {
        for (Type t : types2) {
            if (some condition) {
                // Do something and break...
                break search;
            }
        }
    }
}

40
Anda tidak perlu membuat blok baru untuk menggunakan label.
Jon Skeet

81
Tidak, tapi itu membuat maksudnya jauh lebih jelas. Lihat komentar pertama pada jawaban yang diterima.
Bombe

2
itu sebenarnya bukan blok bernama, setelah label Anda dapat menulis ekspresi Java apa pun tanpa label, apakah name: if(...){...}membuat kondisi bernama? :)
La VloZ Merrill

4
Konstruk ini memiliki keuntungan besar dibandingkan label forlangsung. Anda dapat menambahkan kode sebelum yang terakhir }yang akan dieksekusi hanya jika kondisinya tidak pernah terpenuhi.
Florian F

2
Ini adalah blok bernama dan bukan loop bernama. Anda tidak dapat dalam loop itu "melanjutkan pencarian;" yang benar-benar sintaks hukum jika loop bernama pencarian. Anda dapat mematahkannya, tetapi Anda tidak dapat melanjutkannya.
Tatarize

132

Saya tidak pernah menggunakan label. Sepertinya praktik yang buruk untuk dilakukan. Inilah yang akan saya lakukan:

boolean finished = false;
for (int i = 0; i < 5 && !finished; i++) {
    for (int j = 0; j < 5; j++) {
        if (i * j > 6) {
            finished = true;
            break;
        }
    }
}

4
Jika hal ini tidak && !finishedbukan || !finished? Dan mengapa kemudian menggunakan breaksama sekali dan tidak digunakan && !finisheduntuk loop dalam juga?
Gandalf

4
Saya gunakan breakuntuk dapat keluar dari loop secara sewenang-wenang. Jika ada kode setelah ifblok itu, Anda bisa breaksebelum dijalankan. Tapi kamu benar tentang itu &&. Memperbaikinya.
Elle Mundy

2
solusi bagus! itulah tepatnya yang akan saya lakukan dalam praktik jika memasukkannya ke fungsi tambahan tidak disukai karena alasan tertentu.
Benroth

6
Ada masalah potensial jika ada beberapa logika setelah loop dalam ... yang akan terus dieksekusi dan loop luar rusak hanya ketika iterasi baru dimulai ...
Karthik Karuppannan

7
Saya tidak mengerti mengapa orang harus melakukannya seperti itu. Orang yang bekerja dengan kode harus dapat menggunakan semua fitur bahasa. Saya mengerti bahwa penting untuk menulis kode yang dapat dimengerti orang lain, tetapi tidak dengan membatasi penggunaan alat resmi yang disediakan oleh bahasa dan menemukan solusi untuk fungsi yang sama. Atau apakah Anda memaksudkan hal lain dengan "praktik buruk"?
codepleb

107

Anda dapat menggunakan label:

label1: 
for (int i = 0;;) {
    for (int g = 0;;) {
      break label1;
    }
}

4
Dapatkan +1 dari saya. Sederhana, to the point, menjawab pertanyaan. Tidak dapat dituduh mengulangi jawaban yang ada karena Anda menjawab pada saat yang sama.
Heimdall

40

Gunakan fungsi:

public void doSomething(List<Type> types, List<Type> types2){
  for(Type t1 : types){
    for (Type t : types2) {
      if (some condition) {
         // Do something and return...
         return;
      }
    }
  }
}

20

Anda dapat menggunakan variabel sementara:

boolean outerBreak = false;
for (Type type : types) {
   if(outerBreak) break;
    for (Type t : types2) {
         if (some condition) {
             // Do something and break...
             outerBreak = true;
             break; // Breaks out of the inner loop
         }
    }
}

Bergantung pada fungsi Anda, Anda juga dapat keluar / kembali dari loop dalam:

for (Type type : types) {
    for (Type t : types2) {
         if (some condition) {
             // Do something and break...
             return;
         }
    }
}

7
Saya menemukan cara ini agak berantakan.
boutta

11
Kondisi tambahan memeriksa setiap kali melalui loop? Tidak, terima kasih.
ryandenki

15

Jika Anda tidak menyukai breaks dan gotos, Anda dapat menggunakan "tradisional" untuk loop sebagai ganti untuk-in, dengan kondisi abortasi tambahan:

int a, b;
bool abort = false;
for (a = 0; a < 10 && !abort; a++) {
    for (b = 0; b < 10 && !abort; b++) {
        if (condition) {
            doSomeThing();
            abort = true;
        }
    }
}

2
Tidak cocok untuk foreach loop.
John McClane

1
@JohnMcClane Dan Anda melakukan spamming pada banyak jawaban pada pertanyaan berumur 9+ tahun karena ...?
Quintec

12

Saya perlu melakukan hal serupa, tetapi saya memilih untuk tidak menggunakan loop yang disempurnakan untuk melakukannya.

int s = type.size();
for (int i = 0; i < s; i++) {
    for (int j = 0; j < t.size(); j++) {
        if (condition) {
            // do stuff after which you want 
            // to completely break out of both loops
            s = 0; // enables the _main_ loop to terminate
            break;
        }
    }
}

Saya merasa tidak keren untuk mengulang semua item setelah kondisinya rusak. Jadi saya akan menambahkan istirahat dalam kasus lain.
boutta

@ Boutta Saya tidak yakin bagaimana Anda mencapai kesimpulan ini. Setelah kondisinya benar, kedua loop keluar.
Swifty McSwifterton

OK, saya tidak mendapatkan bagian dengan manipulasi var. Tapi saya menemukan gaya buruk semacam itu karena s mewakili ukuran. Lalu saya lebih suka jawaban dari ddyer dengan vars eksplisit: stackoverflow.com/a/25124317/15108
boutta

@boutta Anda dapat mengubah ske nilai yang lebih rendah dari iatau mengubah ike nilai yang lebih besar atau sama dengan s, keduanya harus melakukan trik. Anda benar tentang perubahan s, karena itu dapat digunakan di tempat lain nanti, tetapi mengubah itidak akan membahayakan, hanya akan memastikan yang pertama fortidak akan melanjutkan perulangan.
Zsolti

9

Saya lebih suka menambahkan "keluar" secara eksplisit ke tes loop. Ini membuat jelas bagi setiap pembaca biasa bahwa loop mungkin berakhir lebih awal.

boolean earlyExit = false;
for(int i = 0 ; i < 10 && !earlyExit; i++) {
     for(int j = 0 ; i < 10 && !earlyExit; j++) { earlyExit = true; }
}

Tidak cocok untuk foreach loop.
John McClane

8

StreamSolusi Java 8 :

List<Type> types1 = ...
List<Type> types2 = ...

types1.stream()
      .flatMap(type1 -> types2.stream().map(type2 -> new Type[]{type1, type2}))
      .filter(types -> /**some condition**/)
      .findFirst()
      .ifPresent(types -> /**do something**/);

1
@ Tvde1 dan masih bermanfaat bagi pengguna lain, jadi metode dan solusi baru selalu diterima
Andrei Suvorkov

Wow, itu jelek.
DS.

7

Biasanya dalam kasus seperti itu, ia datang dalam ruang lingkup logika yang lebih bermakna, katakanlah beberapa pencarian atau memanipulasi beberapa objek 'for'-iterated yang dipertanyakan, jadi saya biasanya menggunakan pendekatan fungsional:

public Object searching(Object[] types) { // Or manipulating
    List<Object> typesReferences = new ArrayList<Object>();
    List<Object> typesReferences2 = new ArrayList<Object>();

    for (Object type : typesReferences) {
        Object o = getByCriterion(typesReferences2, type);
        if(o != null) return o;
    }
    return null;
}

private Object getByCriterion(List<Object> typesReferences2, Object criterion) {
    for (Object typeReference : typesReferences2) {
        if(typeReference.equals(criterion)) {
             // here comes other complex or specific logic || typeReference.equals(new Object())
             return typeReference;
        }
    }
    return null;
}

Kontra utama:

  • kira-kira dua kali lebih banyak garis
  • lebih banyak konsumsi siklus komputasi, yang berarti lebih lambat dari sudut pandang algoritmik
  • lebih banyak pekerjaan mengetik

Pro:

  • semakin tinggi rasio pemisahan pemisahan karena fungsional granularity
  • semakin tinggi rasio kegunaan kembali dan kontrol pencarian / memanipulasi logika tanpa
  • metodenya tidak panjang, sehingga lebih kompak dan mudah dipahami
  • rasio keterbacaan yang lebih tinggi

Jadi itu hanya menangani kasus melalui pendekatan yang berbeda.

Pada dasarnya pertanyaan untuk penulis pertanyaan ini: apa yang Anda pertimbangkan dari pendekatan ini?


6

Anda dapat memutuskan dari semua loop tanpa menggunakan label apa pun: dan bendera.

Itu hanya solusi yang rumit.

Di sini condition1 adalah kondisi yang digunakan untuk break dari loop K dan J. Dan condition2 adalah kondisi yang digunakan untuk break dari loop K, J dan I.

Sebagai contoh:

public class BreakTesting {
    public static void main(String[] args) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                for (int k = 0; k < 9; k++) {
                    if (condition1) {
                        System.out.println("Breaking from Loop K and J");
                        k = 9;
                        j = 9;
                    }
                    if (condition2) {
                        System.out.println("Breaking from Loop K, J and I");
                        k = 9;
                        j = 9;
                        i = 9;
                    }
                }
            }
        }
        System.out.println("End of I , J , K");
    }
}

2
Bagaimana saya menggunakan ini untuk setiap loop? ;)
Willi Mentzel

5
Ini tidak berfungsi jika Anda memiliki kondisi loop yang lebih canggih, seperti list.size ()> 5. Itu juga benar-benar hanya hack. Sulit dibaca dan latihan yang buruk!
Neuron

Ini rawan kesalahan. Bayangkan Anda mengubah loop batin untuk (int k = 0; k < 10; k++)dan Anda tidak memperbaiki semua k = 9untuk k = 10. Anda mungkin masuk ke loop tak terbatas.
Florian F

5

Istirahat berlabel konsep digunakan untuk keluar loop bersarang di Jawa, dengan menggunakan berlabel istirahat Anda dapat mematahkan bersarang loop di posisi apapun. Contoh 1:

loop1:
 for(int i= 0; i<6; i++){
    for(int j=0; j<5; j++){
          if(i==3)
            break loop1;
        }
    }

misalkan ada 3 loop dan Anda ingin mengakhiri loop3: Contoh 2:

loop3: 
for(int i= 0; i<6; i++){
loop2:
  for(int k= 0; k<6; k++){
loop1:
    for(int j=0; j<5; j++){
          if(i==3)
            break loop3;
        }
    }
}

4
boolean broken = false; // declared outside of the loop for efficiency
for (Type type : types) {
    for (Type t : types2) {
        if (some condition) {
            broken = true;
            break;
        }
    }

    if (broken) {
        break;
    }
}

4

Jika ada di dalam beberapa fungsi mengapa Anda tidak mengembalikannya saja:

for (Type type : types) {
    for (Type t : types2) {
         if (some condition) {
            return value;
         }
    }
}

Saya lebih suka pola ini. Ini sering menyebabkan saya membagi loop menjadi fungsi yang terpisah. Kode saya selalu lebih baik setelah melakukannya, jadi untuk alasan ini saya sangat suka jawaban ini.
Bill K

4

Metode Terbaik dan Mudah ..

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

4
Contoh-contoh melanggar ini tidak sangat membantu, karena bahkan tanpa label mereka akan pecah pada titik yang sama. Juga selalu menyenangkan memiliki kode yang benar-benar dapat Anda jalankan, yang tidak terjadi dengan kode Anda, karena innerloop tidak pernah dapat dihubungi ..
Neuron

Saya akan mengetik hal yang sama. Label agak tidak berguna dalam hal ini.
Taslim Oseni

4

Pendekatan yang agak tidak biasa tetapi dalam hal panjang kode ( bukan kinerja ) ini adalah hal termudah yang dapat Anda lakukan:

for(int i = 0; i++; i < j) {
    if(wanna exit) {
        i = i + j; // if more nested, also add the 
                   // maximum value for the other loops
    }
}


4

Satu lagi solusi, disebutkan tanpa contoh (itu benar-benar berfungsi dalam kode prod).

try {
    for (Type type : types) {
        for (Type t : types2) {
            if (some condition #1) {
                // Do something and break the loop.
                throw new BreakLoopException();
            }
        }
    }
}
catch (BreakLoopException e) {
    // Do something on look breaking.
}

Tentu saja BreakLoopExceptionharus internal, pribadi, dan dipercepat tanpa jejak-susun:

private static class BreakLoopException extends Exception {
    @Override
    public StackTraceElement[] getStackTrace() {
        return new StackTraceElement[0];
    }
}

1
Sebenarnya telah disebutkan, dalam jawaban mendapatkan -23 suara ... stackoverflow.com/a/886980/2516301 . Ini akan berhasil, tetapi ini merupakan praktik pemrograman yang sangat buruk ...
vefthym

memang. Namun saya melihat kode warisan seperti itu - loop 4 tingkat bersarang dengan beberapa kondisi kerusakan. dan itu lebih mudah dibaca dengan pengecualian daripada dengan kode sebaris. -23 suara sebagian besar peringkat emosional, tapi ya - pendekatan ini harus digunakan dengan hati-hati.
ursa

1
Itu akan menjadi lebih mudah dibaca jika telah dipecah menjadi pemanggilan fungsi terpisah dengan pusat-kembali. Sering dibuat lebih baik dengan sedikit refactor sehingga masuk akal sebagai fungsi yang berdiri sendiri (sering dapat digunakan kembali).
Bill K

2

for (int j = 0; j < 5; j++) //inner loopharus diganti dengan for (int j = 0; j < 5 && !exitloops; j++).

Di sini, dalam hal ini loop bersarang lengkap harus keluar jika kondisinya True. Tapi kalau kita pakai exitloopshanya ke atasloop

 for (int i = 0; i < 5 && !exitloops; i++) //upper loop

Maka loop dalam akan berlanjut, karena tidak ada bendera tambahan yang memberitahukan loop dalam ini untuk keluar.

Contoh: jika i = 3dan j=2kemudian kondisinya false. Tetapi pada iterasi loop dalam j=3 selanjutnya maka kondisi (i*j)menjadi 9yang mana truetetapi inner loop akan berlanjut sampai jmenjadi 5.

Jadi, itu juga harus digunakan exitloopsuntuk loop dalam.

boolean exitloops = false;
for (int i = 0; i < 5 && !exitloops; i++) { //here should exitloops as a Conditional Statement to get out from the loops if exitloops become true. 
    for (int j = 0; j < 5 && !exitloops; j++) { //here should also use exitloops as a Conditional Statement. 
        if (i * j > 6) {
            exitloops = true;
            System.out.println("Inner loop still Continues For i * j is => "+i*j);
            break;
        }
        System.out.println(i*j);
    }
}

2

Seperti @ 1800 INFORMASI saran, gunakan kondisi yang memecah loop dalam sebagai kondisi di loop luar:

boolean hasAccess = false;
for (int i = 0; i < x && hasAccess == false; i++){
    for (int j = 0; j < y; j++){
        if (condition == true){
            hasAccess = true;
            break;
        }
    }
}

2

Jika ini adalah implementasi baru, Anda dapat mencoba menulis ulang logikanya sebagai pernyataan if-else_if-else.

while(keep_going) {

    if(keep_going && condition_one_holds) {
        // Code
    }
    if(keep_going && condition_two_holds) {
        // Code
    }
    if(keep_going && condition_three_holds) {
        // Code
    }
    if(keep_going && something_goes_really_bad) {
        keep_going=false;
    }
    if(keep_going && condition_four_holds) {
        // Code
    }
    if(keep_going && condition_five_holds) {
        // Code
    }
}

Kalau tidak, Anda dapat mencoba mengatur bendera ketika kondisi khusus itu terjadi dan memeriksa bendera itu di setiap kondisi loop Anda.

something_bad_has_happened = false;
while(something is true && !something_bad_has_happened){
    // Code, things happen
    while(something else && !something_bad_has_happened){
        // Lots of code, things happens
        if(something happened){
            -> Then control should be returned ->
            something_bad_has_happened=true;
            continue;
        }
    }
    if(something_bad_has_happened) { // The things below will not be executed
        continue;
    }

    // Other things may happen here as well, but they will not be executed
    //  once control is returned from the inner cycle.
}

SINI! Jadi, sementara istirahat sederhana tidak akan berhasil, itu dapat dibuat untuk bekerja menggunakan continue.

Jika Anda hanya porting logika dari satu bahasa pemrograman ke Jawa dan hanya ingin mendapatkan hal yang berfungsi Anda dapat mencoba menggunakan label .


2

Demo untuk break, continue, dan label:

Kata kunci breakdan Javacontinue memiliki nilai default. Ini adalah "loop terdekat", dan hari ini, setelah beberapa tahun menggunakan Java, saya baru saja mendapatkannya!

Tampaknya jarang digunakan, tetapi bermanfaat.

import org.junit.Test;

/**
 * Created by cui on 17-5-4.
 */

public class BranchLabel {
    @Test
    public void test() {
        System.out.println("testBreak");
        testBreak();

        System.out.println("testBreakLabel");
        testBreakLabel();

        System.out.println("testContinue");
        testContinue();
        System.out.println("testContinueLabel");
        testContinueLabel();
    }

    /**
     testBreak
     a=0,b=0
     a=0,b=1
     a=1,b=0
     a=1,b=1
     a=2,b=0
     a=2,b=1
     a=3,b=0
     a=3,b=1
     a=4,b=0
     a=4,b=1
     */
    public void testBreak() {
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                if (b == 2) {
                    break;
                }
                System.out.println("a=" + a + ",b=" + b);
            }
        }
    }

    /**
     testContinue
     a=0,b=0
     a=0,b=1
     a=0,b=3
     a=0,b=4
     a=1,b=0
     a=1,b=1
     a=1,b=3
     a=1,b=4
     a=2,b=0
     a=2,b=1
     a=2,b=3
     a=2,b=4
     a=3,b=0
     a=3,b=1
     a=3,b=3
     a=3,b=4
     a=4,b=0
     a=4,b=1
     a=4,b=3
     a=4,b=4
     */
    public void testContinue() {
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                if (b == 2) {
                    continue;
                }
                System.out.println("a=" + a + ",b=" + b);
            }
        }
    }

    /**
     testBreakLabel
     a=0,b=0,c=0
     a=0,b=0,c=1
     * */
    public void testBreakLabel() {
        anyName:
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                for (int c = 0; c < 5; c++) {
                    if (c == 2) {
                        break anyName;
                    }
                    System.out.println("a=" + a + ",b=" + b + ",c=" + c);
                }
            }
        }
    }

    /**
     testContinueLabel
     a=0,b=0,c=0
     a=0,b=0,c=1
     a=1,b=0,c=0
     a=1,b=0,c=1
     a=2,b=0,c=0
     a=2,b=0,c=1
     a=3,b=0,c=0
     a=3,b=0,c=1
     a=4,b=0,c=0
     a=4,b=0,c=1
     */
    public void testContinueLabel() {
        anyName:
        for (int a = 0; a < 5; a++) {
            for (int b = 0; b < 5; b++) {
                for (int c = 0; c < 5; c++) {
                    if (c == 2) {
                        continue anyName;
                    }
                    System.out.println("a=" + a + ",b=" + b + ",c=" + c);
                }
            }
        }
    }
}

2

Demo

public static void main(String[] args) {
    outer:
    while (true) {
        while (true) {
            break outer;
        }
    }
}

1

Anda dapat melakukan hal berikut:

  1. setel variabel lokal ke false

  2. atur variabel itu truedi loop pertama, saat Anda ingin break

  3. maka Anda dapat memeriksa di loop luar, apakah kondisi diatur kemudian istirahat dari loop luar juga.

    boolean isBreakNeeded = false;
    for (int i = 0; i < some.length; i++) {
        for (int j = 0; j < some.lengthasWell; j++) {
            //want to set variable if (){
            isBreakNeeded = true;
            break;
        }
    
        if (isBreakNeeded) {
            break; //will make you break from the outer loop as well
        }
    }

1

Untuk beberapa kasus, Kami dapat menggunakan whileloop secara efektif di sini.

Random rand = new Random();
// Just an example
for (int k = 0; k < 10; ++k) {
    int count = 0;
    while (!(rand.nextInt(200) == 100)) {
       count++;
    }

    results[k] = count;
}

1

Java tidak memiliki fitur goto seperti yang ada di C ++. Tapi tetap saja, gotokata kunci disediakan di Jawa. Mereka mungkin menerapkannya di masa depan. Untuk pertanyaan Anda, jawabannya adalah bahwa ada sesuatu yang disebut label di Java yang dapat Anda terapkan continuedan breakpernyataan. Temukan kode di bawah ini:

public static void main(String ...args) {
    outerLoop: for(int i=0;i<10;i++) {
    for(int j=10;j>0;j--) {
        System.out.println(i+" "+j);
        if(i==j) {
            System.out.println("Condition Fulfilled");
            break outerLoop;
        }
    }
    }
    System.out.println("Got out of the outer loop");
}

1

Bahkan membuat bendera untuk loop luar dan memeriksa bahwa setelah setiap eksekusi loop batin dapat menjadi jawabannya.

Seperti ini:

for (Type type : types) {
    boolean flag=false;
    for (Type t : types2) {
        if (some condition) {
            // Do something and break...
            flag=true;
            break; // Breaks out of the inner loop
        }
    }
    if(flag)
        break;
}

1
boolean condition = false;
for (Type type : types) {
    for (int i = 0; i < otherTypes.size && !condition; i ++) {
        condition = true; // If your condition is satisfied
    }
}

Gunakan conditionsebagai bendera untuk saat Anda selesai memproses. Maka loop dalam hanya berlanjut sementara kondisi belum terpenuhi. Either way, loop luar akan terus chuggin '.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.