⏹️ Break và Continue
🎯 Mục tiêu: Nắm vững cách điều khiển luồng vòng lặp với break, continue, và đặc biệt là labels - tính năng mạnh mẽ của Kotlin.
💡 Khái niệm
Phần tiêu đề “💡 Khái niệm”break: Thoát khỏi vòng lặp ngay lập tứccontinue: Bỏ qua phần còn lại và chuyển sang lần lặp tiếp theolabels: Cho phép break/continue vòng lặp bên ngoài (nested loops)
📝 break
Phần tiêu đề “📝 break”Cú pháp cơ bản
Phần tiêu đề “Cú pháp cơ bản”for (i in 1..10) { if (i == 5) { break // Thoát khi i = 5 } println(i)}// Output: 1, 2, 3, 4Tìm kiếm trong danh sách
Phần tiêu đề “Tìm kiếm trong danh sách”val numbers = listOf(1, 3, 5, 7, 9, 2, 4)var found = false
for (num in numbers) { if (num % 2 == 0) { println("Tìm thấy số chẵn đầu tiên: $num") found = true break }}
if (!found) { println("Không tìm thấy số chẵn")}🔄 continue
Phần tiêu đề “🔄 continue”Cú pháp cơ bản
Phần tiêu đề “Cú pháp cơ bản”for (i in 1..10) { if (i % 2 == 0) { continue // Bỏ qua số chẵn } println(i)}// Output: 1, 3, 5, 7, 9Lọc và xử lý
Phần tiêu đề “Lọc và xử lý”val names = listOf("Alice", "", "Bob", " ", "Charlie")
for (name in names) { if (name.isBlank()) { continue // Bỏ qua tên rỗng } println("Hello, ${name.trim()}!")}🏷️ Labels - Tính năng đặc biệt của Kotlin
Phần tiêu đề “🏷️ Labels - Tính năng đặc biệt của Kotlin”Labels cho phép break/continue vòng lặp bên ngoài trong nested loops:
Cú pháp
Phần tiêu đề “Cú pháp”labelName@ for (...) { for (...) { break@labelName // Thoát vòng lặp được đánh dấu continue@labelName // Tiếp tục vòng lặp được đánh dấu }}break với label
Phần tiêu đề “break với label”outer@ for (i in 1..5) { for (j in 1..5) { if (i * j > 10) { println("Breaking at i=$i, j=$j") break@outer // Thoát cả 2 vòng lặp } print("${i * j} ") } println()}continue với label
Phần tiêu đề “continue với label”outer@ for (i in 1..3) { for (j in 1..3) { if (j == 2) { continue@outer // Bỏ qua và tiếp tục vòng ngoài } println("i=$i, j=$j") }}// Output:// i=1, j=1// i=2, j=1// i=3, j=1🎯 Use Cases thực tế
Phần tiêu đề “🎯 Use Cases thực tế”Tìm kiếm trong ma trận
Phần tiêu đề “Tìm kiếm trong ma trận”val matrix = arrayOf( intArrayOf(1, 2, 3), intArrayOf(4, 5, 6), intArrayOf(7, 8, 9))val target = 5var found = false
search@ for (i in matrix.indices) { for (j in matrix[i].indices) { if (matrix[i][j] == target) { println("Tìm thấy $target tại [$i][$j]") found = true break@search } }}Validate input
Phần tiêu đề “Validate input”val validInputs = mutableListOf<Int>()val inputs = listOf("10", "abc", "20", "", "30", "-5")
for (input in inputs) { val number = input.toIntOrNull()
if (number == null) { println("'$input' không phải số, bỏ qua") continue }
if (number < 0) { println("$number là số âm, bỏ qua") continue }
validInputs.add(number)}
println("Valid inputs: $validInputs") // [10, 20, 30]🛠️ Thực hành
Phần tiêu đề “🛠️ Thực hành”Bài tập 1: Tìm số nguyên tố đầu tiên > 100
fun main() { // TODO: Tìm và in số nguyên tố đầu tiên lớn hơn 100}Lời giải:
fun main() { for (n in 101..Int.MAX_VALUE) { var isPrime = true
for (i in 2..kotlin.math.sqrt(n.toDouble()).toInt()) { if (n % i == 0) { isPrime = false break } }
if (isPrime) { println("Số nguyên tố đầu tiên > 100: $n") break } } // Output: 101}Bài tập 2: In các số không chia hết cho 3 và 5
fun main() { // TODO: In các số từ 1-30 không chia hết cho 3 và 5}Lời giải:
fun main() { println("Số không chia hết cho 3 và 5 (1-30):") for (i in 1..30) { if (i % 3 == 0 || i % 5 == 0) { continue } print("$i ") } // 1 2 4 7 8 11 13 14 16 17 19 22 23 26 28 29}Bài tập 3: Tìm cặp số có tổng = target
fun main() { val numbers = listOf(2, 7, 11, 15, 3, 6) val target = 9
// TODO: Tìm cặp số có tổng = 9}Lời giải:
fun main() { val numbers = listOf(2, 7, 11, 15, 3, 6) val target = 9
search@ for (i in numbers.indices) { for (j in i + 1 until numbers.size) { if (numbers[i] + numbers[j] == target) { println("Cặp số: ${numbers[i]} + ${numbers[j]} = $target") break@search } } }}📱 Trong Android
Phần tiêu đề “📱 Trong Android”// Tìm view trong hierarchyfun findViewByTag(parent: ViewGroup, tag: String): View? { for (i in 0 until parent.childCount) { val child = parent.getChildAt(i) if (child.tag == tag) { return child } if (child is ViewGroup) { findViewByTag(child, tag)?.let { return it } } } return null}
// Parse data, skip invalidval validUsers = mutableListOf<User>()for (jsonUser in jsonArray) { val name = jsonUser.optString("name") if (name.isBlank()) continue
val age = jsonUser.optInt("age", -1) if (age < 0) continue
validUsers.add(User(name, age))}⚠️ Lưu ý quan trọng
Phần tiêu đề “⚠️ Lưu ý quan trọng”✅ Checklist - Tự kiểm tra
Phần tiêu đề “✅ Checklist - Tự kiểm tra”Sau bài học này, bạn có thể:
- Sử dụng
breakđể thoát vòng lặp - Sử dụng
continueđể bỏ qua iteration - Hiểu và sử dụng labels cho nested loops
- Biết khi nào dùng
break@labelvscontinue@label
Tiếp theo: Hàm (Function)