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

วิธีแปลง List เป็น Map ใน Kotlin

ภาพรวม

Kotlin มีฟังก์ชันหลายตัวสำหรับแปลง List ให้กลายเป็น Map (Key-Value) เลือกใช้ตามรูปแบบข้อมูลและความต้องการ

ข้อมูลตัวอย่าง

data class Subject(val name: String, val priority: String)

val subjects = listOf(
    Subject("Java", "1"),
    Subject("Kotlin", "2"),
    Subject("C", "3")
)

วิธีที่ 1: associate() - ยืดหยุ่นที่สุด

val map = subjects.associate { it.priority to it.name }
// {1=Java, 2=Kotlin, 3=C}

// ใช้งาน: สร้าง Pair เองได้ตามตอง
val map2 = subjects.associate { it.name to it.priority }
// {Java=1, Kotlin=2, C=3}

วิธีที่ 2: associateBy() - Key Selector แยกจาก Value Selector

val map = subjects.associateBy(
    keySelector = { it.priority },  // Key
    valueTransform = { it.name }    // Value
)
// {1=Java, 2=Kotlin, 3=C}

// ถ้า Value ใช้ Object ทั้งตัว
val mapObj = subjects.associateBy({ it.priority }) { it }
// {1=Subject(name=Java, priority=1), ...}

วิธีที่ 3: toMap() หลัง map()

val map = subjects.map { it.priority to it.name }.toMap()
// {1=Java, 2=Kotlin, 3=C}

วิธีที่ 4: associateWith() - Key คงที่ Value แปลง

// Key ใช้ name, Value แปลงจาก priority
val map = subjects.associateWith { it.priority }
// {Java=1, Kotlin=2, C=3}

การจัดการ Duplicate Key

val withDup = listOf(
    Subject("Java", "1"),
    Subject("Kotlin", "1"), // Duplicate key "1"
    Subject("C", "3")
)

// associate/associateBy: ตัวหลังทับตัวหน้า (Last wins)
val map = withDup.associateBy({ it.priority }) { it.name }
// {1=Kotlin, 3=C}  <- "Java" ถูกทับ

// ถ้าต้องการรวมค่า (Merge)
val merged = withDup.groupBy({ it.priority }) { it.name }
// {1=[Java, Kotlin], 3=[C]}  -> Map>

ตารางเปรียบเทียบ

Functionใช้เมื่อDuplicate Key
associateต้องการสร้าง Pair เองทั้ง Key/ValueLast wins
associateByแยก Key Selector และ Value TransformLast wins
map + toMapทำ Transform แล้วค่อย toMapLast wins
associateWithKey ใช้ Property ตรงๆ Value แปลงLast wins
groupByต้องการรวมค่าที่ Key ซ้ำกันกลายเป็น List

Performance Note

  • ทั้งหมดเป็น O(n) - วนลูปครั้งเดียว
  • associate และ associateBy มี Overhead น้อยกว่า map().toMap() (สร้าง Intermediate List)
  • สำหรับ List ใหญ่ ควรใช้ associate หรือ associateBy โดยตรง