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.
java
loops
nested-loops
boutta
sumber
sumber
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).outerloop
adalah label. Saya tidak tahu persis kode apa yang Anda coba, tetapi kode dalam jawaban saya mengkompilasi dan berjalan dengan baik.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:
Cocok dengan contoh untuk jawaban yang diterima:
sumber
loop
metode dan kembali dari metode untuk melanjutkan.Anda dapat menggunakan blok bernama di sekitar loop:
sumber
name: if(...){...}
membuat kondisi bernama? :)for
langsung. Anda dapat menambahkan kode sebelum yang terakhir}
yang akan dieksekusi hanya jika kondisinya tidak pernah terpenuhi.Saya tidak pernah menggunakan label. Sepertinya praktik yang buruk untuk dilakukan. Inilah yang akan saya lakukan:
sumber
&& !finished
bukan|| !finished
? Dan mengapa kemudian menggunakanbreak
sama sekali dan tidak digunakan&& !finished
untuk loop dalam juga?break
untuk dapat keluar dari loop secara sewenang-wenang. Jika ada kode setelahif
blok itu, Anda bisabreak
sebelum dijalankan. Tapi kamu benar tentang itu&&
. Memperbaikinya.Anda dapat menggunakan label:
sumber
Gunakan fungsi:
sumber
Anda dapat menggunakan variabel sementara:
Bergantung pada fungsi Anda, Anda juga dapat keluar / kembali dari loop dalam:
sumber
Jika Anda tidak menyukai
break
s dangoto
s, Anda dapat menggunakan "tradisional" untuk loop sebagai ganti untuk-in, dengan kondisi abortasi tambahan:sumber
Saya perlu melakukan hal serupa, tetapi saya memilih untuk tidak menggunakan loop yang disempurnakan untuk melakukannya.
sumber
s
ke nilai yang lebih rendah darii
atau mengubahi
ke nilai yang lebih besar atau sama dengans
, keduanya harus melakukan trik. Anda benar tentang perubahans
, karena itu dapat digunakan di tempat lain nanti, tetapi mengubahi
tidak akan membahayakan, hanya akan memastikan yang pertamafor
tidak akan melanjutkan perulangan.Saya lebih suka menambahkan "keluar" secara eksplisit ke tes loop. Ini membuat jelas bagi setiap pembaca biasa bahwa loop mungkin berakhir lebih awal.
sumber
Stream
Solusi Java 8 :sumber
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:
Kontra utama:
Pro:
Jadi itu hanya menangani kasus melalui pendekatan yang berbeda.
Pada dasarnya pertanyaan untuk penulis pertanyaan ini: apa yang Anda pertimbangkan dari pendekatan ini?
sumber
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:
sumber
(int k = 0; k < 10; k++)
dan Anda tidak memperbaiki semuak = 9
untukk = 10
. Anda mungkin masuk ke loop tak terbatas.Istirahat berlabel konsep digunakan untuk keluar loop bersarang di Jawa, dengan menggunakan berlabel istirahat Anda dapat mematahkan bersarang loop di posisi apapun. Contoh 1:
misalkan ada 3 loop dan Anda ingin mengakhiri loop3: Contoh 2:
sumber
sumber
Jika ada di dalam beberapa fungsi mengapa Anda tidak mengembalikannya saja:
sumber
Metode Terbaik dan Mudah ..
sumber
Pendekatan yang agak tidak biasa tetapi dalam hal panjang kode ( bukan kinerja ) ini adalah hal termudah yang dapat Anda lakukan:
sumber
Gunakan Label.
Lihat artikel ini
sumber
Satu lagi solusi, disebutkan tanpa contoh (itu benar-benar berfungsi dalam kode prod).
Tentu saja
BreakLoopException
harus internal, pribadi, dan dipercepat tanpa jejak-susun:sumber
for (int j = 0; j < 5; j++) //inner loop
harus diganti denganfor (int j = 0; j < 5 && !exitloops; j++)
.Di sini, dalam hal ini loop bersarang lengkap harus keluar jika kondisinya
True
. Tapi kalau kita pakaiexitloops
hanya ke atasloop
Maka loop dalam akan berlanjut, karena tidak ada bendera tambahan yang memberitahukan loop dalam ini untuk keluar.
Jadi, itu juga harus digunakan
exitloops
untuk loop dalam.sumber
Seperti @ 1800 INFORMASI saran, gunakan kondisi yang memecah loop dalam sebagai kondisi di loop luar:
sumber
Jika ini adalah implementasi baru, Anda dapat mencoba menulis ulang logikanya sebagai pernyataan if-else_if-else.
Kalau tidak, Anda dapat mencoba mengatur bendera ketika kondisi khusus itu terjadi dan memeriksa bendera itu di setiap kondisi loop Anda.
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 .
sumber
Demo untuk
break
,continue
, danlabel
:Kata kunci
break
dan 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.
sumber
Demo
sumber
Anda dapat melakukan hal berikut:
setel variabel lokal ke
false
atur variabel itu
true
di loop pertama, saat Anda ingin breakmaka Anda dapat memeriksa di loop luar, apakah kondisi diatur kemudian istirahat dari loop luar juga.
sumber
Untuk beberapa kasus, Kami dapat menggunakan
while
loop secara efektif di sini.sumber
Java tidak memiliki fitur goto seperti yang ada di C ++. Tapi tetap saja,
goto
kata 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 terapkancontinue
danbreak
pernyataan. Temukan kode di bawah ini:sumber
Bahkan membuat bendera untuk loop luar dan memeriksa bahwa setelah setiap eksekusi loop batin dapat menjadi jawabannya.
Seperti ini:
sumber
Gunakan
condition
sebagai bendera untuk saat Anda selesai memproses. Maka loop dalam hanya berlanjut sementara kondisi belum terpenuhi. Either way, loop luar akan terus chuggin '.sumber