Pertanyaan Putus dari loop bersarang di Jawa


Saya punya konstruk bertingkat 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 terkait dengan Java secara khusus. Saya tidak bisa menerapkan solusi ini karena sebagian besar menggunakan gotos.

Saya tidak ingin menempatkan lingkaran dalam dengan metode yang berbeda.

Pembaruan: Saya tidak ingin memutarkan loop, ketika melanggar saya selesai dengan eksekusi blok loop.


1539
2018-05-20 09:07


asal


Jawaban:


Seperti penjawab lainnya, saya pasti lebih suka untuk menempatkan lingkaran dalam dengan metode yang berbeda. Jawaban ini hanya menunjukkan bagaimana persyaratan dalam pertanyaan dapat dipenuhi.

Kamu dapat memakai break dengan label untuk lingkaran 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");
    }
}

Cetakan ini:

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

2080
2018-05-20 09:11



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

Itu akan membuahkan hasil karena mudah dibaca.

Kode itu akan menjadi sesuatu 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; 
}

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

368
2017-11-14 18:26



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

186
2018-05-20 09:12



Saya tidak pernah menggunakan label. Sepertinya itu adalah 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;
        }
    }
}

112
2017-12-07 17:52



Anda dapat menggunakan label:

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

79
2018-05-20 09:11



mungkin dengan suatu 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;
      }
    }
  }
}

32
2018-05-20 11:43



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

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

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

15
2018-05-20 09:11



Jika kamu tidak suka breaks dan gotos, Anda dapat menggunakan "tradisional" untuk loop, bukan untuk-dalam, dengan kondisi membatalkan 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;
        }
    }
}

10
2017-12-21 22:56



Saya perlu melakukan hal yang sama, tetapi saya memilih untuk tidak menggunakan loop yang ditingkatkan 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;
        }
    }
}

9
2018-02-05 06:04



Saya lebih suka menambahkan "exit" eksplisit ke tes loop. Itu membuatnya jelas pembaca biasa bahwa pengulangan dapat berakhir lebih awal.

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

5
2017-08-04 17:29