ภาพรวม
HashMap ใน Kotlin เก็บข้อมูลแบบ Key-Value Pair โดย Key ต้องไม่ซ้ำ Kotlin มีหลายวิธีในการ Iterate (วนลูป) ผ่าน HashMap
สร้าง HashMap ตัวอย่าง
fun main() {
val subject = hashMapOf(
"Java" to 1,
"Kotlin" to 2,
"Python" to 3,
"C++" to 4,
"SQL" to 5
)
// ... ตัวอย่างการวนลูปด้านล่าง
}
วิธีที่ 1: for Loop ด้วย Destructuring (แนะนำ)
println("--- for loop with destructuring ---")
for ((key, value) in subject) {
println("Subject: $key, Priority: $value")
}
วิธีที่ 2: forEach()
println("--- forEach ---")
subject.forEach { (key, value) ->
println("Subject: $key, Priority: $value")
}
// หรือแบบไม่ destructuring
subject.forEach { entry ->
println("Key: ${entry.key}, Value: ${entry.value}")
}
วิธีที่ 3: Iterator() - เข้าถึง Key แล้วค่อยหา Value
println("--- iterator() ---")
val iterator = subject.keys.iterator()
while (iterator.hasNext()) {
val key = iterator.next()
val value = subject[key] // ต้อง null check ถ้า Key อาจไม่มี
println("Subject: $key, Priority: $value")
}
วิธีที่ 4: Iterate เฉพาะ Keys หรือ Values
println("--- Keys only ---")
subject.keys.forEach { println("Key: $it") }
println("--- Values only ---")
subject.values.forEach { println("Value: $it") }
// หรือ
for (key in subject.keys) { println(key) }
for (value in subject.values) { println(value) }
วิธีที่ 5: EntrySet - เข้าถึง Map.Entry
println("--- entries ---")
for (entry in subject.entries) {
println("${entry.key} -> ${entry.value}")
}
// หรือ
subject.entries.forEach { println("${it.key} -> ${it.value}") }
ผลลัพธ์ตัวอย่าง
--- for loop with destructuring ---
Subject: Java, Priority: 1
Subject: Kotlin, Priority: 2
Subject: Python, Priority: 3
Subject: C++, Priority: 4
Subject: SQL, Priority: 5
หมายเหตุ: ลำดับอาจแตกต่างไป เพราะ HashMap ไม่รับประกันลำดับ
LinkedHashMap - รักษาลำดับการ Insert
val orderedMap = linkedMapOf(
"First" to 1,
"Second" to 2,
"Third" to 3
)
// Iterate จะได้ลำดับ First, Second, Third ตามที่ใส่เข้าไป
การกรองและแปลงข้อมูลระหว่าง Iterate
// Filter แล้ว Iterate
subject.filter { it.value > 2 }
.forEach { println("High priority: ${it.key}") }
// Transform ขณะ Iterate
val names = subject.map { "${it.key} (Priority: ${it.value})" }
println(names.joinToString(", "))
สรุปแนวทางเลือก
- for ((k, v) in map) - อ่านง่าย ที่สุด สำหรับกรณีทั่วไป
- forEach { (k, v) -> } - Functional Style เหมาะกับ Chain Operation
- keys / values / entries - เมื่อต้องการเฉพาะบางส่วน
- iterator() - รeldenนำไปใช้กับ Algorithm ต้องการ Control Flow เฉพาะ