Bỏ qua để đến nội dung

🔄 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.


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

// 1 đến 5 (bao gồm cả 5)
for (i in 1..5) {
println(i) // 1, 2, 3, 4, 5
}
// 1 đến 4 (không bao gồm 5)
for (i in 1 until 5) {
println(i) // 1, 2, 3, 4
}
for (i in 5 downTo 1) {
println(i) // 5, 4, 3, 2, 1
}
// Đếm lên, bước 2
for (i in 0..10 step 2) {
println(i) // 0, 2, 4, 6, 8, 10
}
// Đếm xuống, bước 3
for (i in 15 downTo 0 step 3) {
println(i) // 15, 12, 9, 6, 3, 0
}

val fruits = listOf("Apple", "Banana", "Orange")
for (fruit in fruits) {
println(fruit)
}
val fruits = listOf("Apple", "Banana", "Orange")
for (i in fruits.indices) {
println("$i: ${fruits[i]}")
}
// 0: Apple
// 1: Banana
// 2: Orange
val fruits = listOf("Apple", "Banana", "Orange")
for ((index, fruit) in fruits.withIndex()) {
println("$index: $fruit")
}

val word = "Kotlin"
for (char in word) {
println(char) // K, o, t, l, i, n
}
// Với index
for ((i, c) in word.withIndex()) {
println("$i: $c")
}

val scores = mapOf("Alice" to 95, "Bob" to 87, "Charlie" to 92)
for ((name, score) in scores) {
println("$name: $score điểm")
}

Khi chỉ cần lặp n lần mà không cần biến đếm:

repeat(5) {
println("Hello!")
}
// Với index
repeat(5) { index ->
println("Lần ${index + 1}")
}

val numbers = listOf(1, 2, 3, 4, 5)
// forEach
numbers.forEach { println(it) }
// forEachIndexed
numbers.forEachIndexed { index, number ->
println("$index: $number")
}

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

// RecyclerView data binding
items.forEachIndexed { index, item ->
Log.d("Adapter", "Position $index: ${item.name}")
}
// Populate spinner
val options = listOf("Option 1", "Option 2", "Option 3")
for ((index, option) in options.withIndex()) {
spinner.adapter.add(option)
}
// Animate views
for (i in 0 until container.childCount) {
val child = container.getChildAt(i)
child.animate()
.alpha(1f)
.setStartDelay(i * 100L)
.start()
}


Sau bài học này, bạn có thể:

  • Sử dụng ..until cho 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 indices hoặc withIndex()
  • Sử dụng repeat(n) cho lặp đơn giản
  • Sử dụng forEach cho functional style

Tiếp theo: Vòng lặp while