Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีวนลูป HashMap ใน Kotlin

ภาพรวม

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 เฉพาะ