Memecahkan Gelung Bersarang

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan membuat beberapa contoh untuk menunjukkan cara yang berbeza untuk menggunakan break in loop. Seterusnya, kita juga akan melihat cara menghentikan gelung tanpa menggunakan putus sama sekali.

2. Masalahnya

Gelung bersarang sangat berguna, misalnya, untuk mencari dalam senarai senarai.

Salah satu contohnya ialah senarai pelajar, di mana setiap pelajar mempunyai senarai kursus yang dirancang. Katakan kita mahu mencari nama satu orang yang merancang kursus 0 .

Pertama, kita akan melihat senarai pelajar. Kemudian, di dalam gelung itu, kita akan melihat senarai kursus yang dirancang.

Apabila kami mencetak nama pelajar dan kursus kami akan mendapat hasil berikut:

student 0 course 0 course 1 student 1 course 0 course 1

Kami ingin mencari pelajar pertama yang merancang kursus 0 . Namun, jika kita hanya menggunakan gelung maka aplikasi akan terus dicari setelah kursus dijumpai.

Setelah menemui seseorang yang merancang kursus tertentu, kami ingin berhenti mencari. Melanjutkan pencarian memerlukan lebih banyak masa dan sumber daya sementara kita tidak memerlukan maklumat tambahan. Itulah sebabnya kami mahu keluar dari gelung bersarang.

3. Rehat

Pilihan pertama yang harus kita keluar dari gelung bersarang adalah dengan hanya menggunakan pernyataan rehat :

String result = ""; for (int outerCounter = 0; outerCounter < 2; outerCounter++) { result += "outer" + outerCounter; for (int innerCounter = 0; innerCounter < 2; innerCounter++) { result += "inner" + innerCounter; if (innerCounter == 0) { break; } } } return result;

Kami mempunyai gelung luar dan gelung dalam, kedua gelung mempunyai dua lelaran. Sekiranya pembilang gelung dalam sama dengan 0 kita melaksanakan perintah putus . Apabila kita menjalankan contohnya, ia akan menunjukkan hasil berikut:

outer0inner0outer1inner0

Atau kita boleh menyesuaikan kod untuk menjadikannya lebih mudah dibaca:

outer 0 inner 0 outer 1 inner 0

Adakah ini yang kita mahukan?

Hampir, gelung dalaman ditamatkan oleh pernyataan putus setelah 0 dijumpai. Walau bagaimanapun, gelung luar berterusan, yang tidak seperti yang kita mahukan. Kami mahu menghentikan pemprosesan sepenuhnya sebaik sahaja ada jawapannya.

4. Cuti Label

Contoh sebelumnya adalah langkah ke arah yang benar, tetapi kita perlu memperbaikinya sedikit. Kita boleh melakukannya dengan menggunakan rehat berlabel :

String result = ""; myBreakLabel: for (int outerCounter = 0; outerCounter < 2; outerCounter++) { result += "outer" + outerCounter; for (int innerCounter = 0; innerCounter < 2; innerCounter++) { result += "inner" + innerCounter; if (innerCounter == 0) { break myBreakLabel; } } } return result;

A dilabel rehat akan menamatkan gelung luar bukan hanya gelung dalaman. Kami mencapainya dengan menambahkan myBreakLabel di luar gelung dan mengubah pernyataan rehat untuk menghentikan myBreakLabel . Selepas kita menjalankan contoh, kita mendapat hasil berikut:

outer0inner0

Kita boleh membacanya sedikit lebih baik dengan beberapa format:

outer 0 inner 0

Sekiranya kita melihat hasilnya, kita dapat melihat bahawa gelung dalam dan gelung luar ditamatkan, itulah yang ingin kita capai.

5. Kembali

Sebagai alternatif, kami juga boleh menggunakan penyata pengembalian untuk mengembalikan hasilnya secara langsung apabila didapati:

String result = ""; for (int outerCounter = 0; outerCounter < 2; outerCounter++) { result += "outer" + outerCounter; for (int innerCounter = 0; innerCounter < 2; innerCounter++) { result += "inner" + innerCounter; if (innerCounter == 0) { return result; } } } return "failed";

Label dikeluarkan dan pernyataan rehat diganti dengan pernyataan pengembalian .

Apabila kita melaksanakan kod di atas, kita akan mendapat hasil yang sama seperti untuk rehat berlabel. Perhatikan bahawa untuk strategi ini berfungsi, kita biasanya perlu memindahkan blok gelung ke dalam kaedahnya sendiri.

6. Kesimpulannya

Oleh itu, kami baru sahaja melihat apa yang harus dilakukan ketika perlu keluar lebih awal dari satu gelung, seperti ketika kami menemui item yang kami cari. Kata kunci rehat berguna untuk gelung tunggal, dan kita boleh menggunakan kata putus berlabel untuk gelung bersarang.

Sebagai alternatif, kita boleh menggunakan penyata pengembalian . Menggunakan kembali menjadikan kod lebih baik dibaca dan kurang ralat kerana kita tidak perlu memikirkan perbezaan antara jeda yang tidak berlabel dan berlabel.

Jangan ragu untuk melihat kod di GitHub.