🔄 Vòng lặp for
🎯 Mục tiêu: Nắm vững vòng lặp for với ranges, progressions, indices, và các kỹ thuật duyệt collections.
💡 Khái niệm
Phần tiêu đề “💡 Khái niệm”Vòng lặp for trong Kotlin khác so với Java. Kotlin không có for loop truyền thống for(i=0; i<n; i++), thay vào đó sử dụng for-in để duyệt qua các iterable.
for (item in collection) { println(item)}📝 Duyệt qua Ranges
Phần tiêu đề “📝 Duyệt qua Ranges”Range cơ bản với ..
Phần tiêu đề “Range cơ bản với ..”// 1 đến 5 (bao gồm cả 5)for (i in 1..5) { println(i) // 1, 2, 3, 4, 5}Range không bao gồm cuối với until
Phần tiêu đề “Range không bao gồm cuối với until”// 1 đến 4 (không bao gồm 5)for (i in 1 until 5) { println(i) // 1, 2, 3, 4}Đếm ngược với downTo
Phần tiêu đề “Đếm ngược với downTo”for (i in 5 downTo 1) { println(i) // 5, 4, 3, 2, 1}Bước nhảy với step
Phần tiêu đề “Bước nhảy với step”// Đếm lên, bước 2for (i in 0..10 step 2) { println(i) // 0, 2, 4, 6, 8, 10}
// Đếm xuống, bước 3for (i in 15 downTo 0 step 3) { println(i) // 15, 12, 9, 6, 3, 0}📋 Duyệt qua Collections
Phần tiêu đề “📋 Duyệt qua Collections”val fruits = listOf("Apple", "Banana", "Orange")
for (fruit in fruits) { println(fruit)}Với index sử dụng indices
Phần tiêu đề “Với index sử dụng indices”val fruits = listOf("Apple", "Banana", "Orange")
for (i in fruits.indices) { println("$i: ${fruits[i]}")}// 0: Apple// 1: Banana// 2: OrangeVới index sử dụng withIndex()
Phần tiêu đề “Với index sử dụng withIndex()”val fruits = listOf("Apple", "Banana", "Orange")
for ((index, fruit) in fruits.withIndex()) { println("$index: $fruit")}🔤 Duyệt qua String
Phần tiêu đề “🔤 Duyệt qua String”val word = "Kotlin"
for (char in word) { println(char) // K, o, t, l, i, n}
// Với indexfor ((i, c) in word.withIndex()) { println("$i: $c")}🗺️ Duyệt qua Map
Phần tiêu đề “🗺️ Duyệt qua Map”val scores = mapOf("Alice" to 95, "Bob" to 87, "Charlie" to 92)
for ((name, score) in scores) { println("$name: $score điểm")}🔄 Repeat
Phần tiêu đề “🔄 Repeat”Khi chỉ cần lặp n lần mà không cần biến đếm:
repeat(5) { println("Hello!")}
// Với indexrepeat(5) { index -> println("Lần ${index + 1}")}🔀 forEach (Functional style)
Phần tiêu đề “🔀 forEach (Functional style)”val numbers = listOf(1, 2, 3, 4, 5)
// forEachnumbers.forEach { println(it) }
// forEachIndexednumbers.forEachIndexed { index, number -> println("$index: $number")}🛠️ Thực hành
Phần tiêu đề “🛠️ Thực hành”Bài tập 1: In bảng cửu chương
fun main() { val n = 7
// TODO: In bảng cửu chương của số n}Lời giải:
fun main() { val n = 7
println("=== Bảng cửu chương $n ===") for (i in 1..10) { println("$n x $i = ${n * i}") }}Bài tập 2: Tính tổng số chẵn
fun main() { // TODO: Tính tổng các số chẵn từ 1 đến 100}Lời giải:
fun main() { var sum = 0 for (i in 2..100 step 2) { sum += i } println("Tổng số chẵn từ 1-100: $sum") // 2550
// Hoặc functional style val sum2 = (2..100 step 2).sum() println("Tổng (functional): $sum2")}Bài tập 3: Đảo ngược chuỗi
fun main() { val text = "Kotlin"
// TODO: In chuỗi đảo ngược}Lời giải:
fun main() { val text = "Kotlin"
// Cách 1: for loop var reversed = "" for (i in text.lastIndex downTo 0) { reversed += text[i] } println(reversed) // niltoK
// Cách 2: reversed() println(text.reversed()) // niltoK}Bài tập 4: In tam giác sao
fun main() { val height = 5
// TODO: In tam giác sao // * // ** // *** // **** // *****}Lời giải:
fun main() { val height = 5
for (i in 1..height) { println("*".repeat(i)) }
// Hoặc for (i in 1..height) { for (j in 1..i) { print("*") } println() }}📱 Trong Android
Phần tiêu đề “📱 Trong Android”// RecyclerView data bindingitems.forEachIndexed { index, item -> Log.d("Adapter", "Position $index: ${item.name}")}
// Populate spinnerval options = listOf("Option 1", "Option 2", "Option 3")for ((index, option) in options.withIndex()) { spinner.adapter.add(option)}
// Animate viewsfor (i in 0 until container.childCount) { val child = container.getChildAt(i) child.animate() .alpha(1f) .setStartDelay(i * 100L) .start()}⚠️ 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
..vàuntilcho ranges - Sử dụng
downTođể đếm ngược - Sử dụng
stepđể thay đổi bước nhảy - Duyệt collections với
for (item in collection) - Lấy index với
indiceshoặcwithIndex() - Sử dụng
repeat(n)cho lặp đơn giản - Sử dụng
forEachcho functional style
Tiếp theo: Vòng lặp while