0Pricing
Kotlin Academy · บทเรียน

Data Class ในคอลเลกชันและในฐานะคีย์ของ Map

ใช้ data class ในเซตและแผนที่โดยอาศัยความเท่าเทียมเชิงโครงสร้าง

Data Class ในคอลเลกชันและในฐานะคีย์ของ Map เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คลาสข้อมูลในฐานะออบเจ็กต์ค่า

เนื่องจากคลาสข้อมูลเขียนทับ equals และ hashCode โดยอิงตามโครงสร้าง จึงทำงานได้อย่างเหมาะสมในเซตและในฐานะคีย์ของแมป ต่างจากคลาสทั่วไป

คลาสทั่วไป: คีย์แมปที่ไม่เหมาะสม

คลาสทั่วไปใช้ความเท่ากันของการอ้างอิงโดยค่าเริ่มต้น ออบเจ็กต์สองตัวที่ดูเหมือนเท่ากันจะเป็นคีย์แมปคนละตัวกัน
class Key(val id: Int)  // no equals/hashCode
val map = mutableMapOf<Key, String>()
val k1 = Key(1)
val k2 = Key(1)  // same id, different object
map[k1] = "value"
println(map[k2])  // null! k2 != k1 by reference

คลาสข้อมูล: คีย์แมปที่ถูกต้อง

คลาสข้อมูลใช้ความเท่ากันเชิงโครงสร้าง ออบเจ็กต์สองตัวที่มีพร็อพเพอร์ตีเหมือนกันจะถือว่าเท่ากัน
data class Key(val id: Int)
val map = mutableMapOf<Key, String>()
val k1 = Key(1)
val k2 = Key(1)
map[k1] = "value"
println(map[k2])  // "value"! Equal by value

คลาสข้อมูลในเซต

เซตใช้ equals และ hashCode เพื่อกำจัดค่าซ้ำ คลาสข้อมูลจึงกำจัดค่าซ้ำได้อย่างถูกต้อง
data class Tag(val name: String)
val tags = mutableSetOf<Tag>()
tags.add(Tag("kotlin"))
tags.add(Tag("kotlin"))  // duplicate
tags.add(Tag("java"))
println(tags.size)  // 2 (not 3)

GroupBy กับคลาสข้อมูล

จัดกลุ่มคอลเลกชันตามคีย์ที่เป็นคลาสข้อมูล
data class Category(val name: String, val parent: String)
val items = listOf(
    "List" to Category("Collections", "stdlib"),
    "Map" to Category("Collections", "stdlib"),
    "Flow" to Category("Coroutines", "kotlinx")
)
val grouped = items.groupBy { it.second }
println(grouped.keys.size)  // 2

การนับจำนวนครั้งที่ปรากฏด้วยแมป

นับจำนวนครั้งที่ข้อมูลแบบมีโครงสร้างปรากฏ โดยใช้คลาสข้อมูลเป็นคีย์ของแมป
data class Pair2(val x: Int, val y: Int)
val points = listOf(Pair2(1,2), Pair2(1,2), Pair2(3,4))
val counts = points.groupingBy { it }.eachCount()
println(counts)  // {Pair2(x=1, y=2)=2, Pair2(x=3, y=4)=1}

คลาสข้อมูลแบบซ้อนกัน

คลาสข้อมูลสามารถมีคลาสข้อมูลอื่นอยู่ภายในได้ โดย equals และ hashCode จะเปรียบเทียบข้อมูลแบบลึกสำหรับคลาสข้อมูลที่ซ้อนกัน
data class Address(val city: String, val country: String)
data class Person(val name: String, val address: Address)
val p1 = Person("Alice", Address("Berlin", "DE"))
val p2 = Person("Alice", Address("Berlin", "DE"))
println(p1 == p2)  // true

sortedBy กับคลาสข้อมูล

เรียงลำดับรายการอินสแตนซ์ของคลาสข้อมูลตามพร็อพเพอร์ตีหนึ่งรายการ
data class Student(val name: String, val grade: Double)
val students = listOf(
    Student("Bob", 3.2),
    Student("Alice", 3.8),
    Student("Charlie", 2.9)
)
println(students.sortedBy { it.grade })

คลาสข้อมูลกับการแคช

ใช้คลาสข้อมูลเป็นคีย์แคชใน HashMap เมื่อคีย์แคชประกอบด้วยหลายส่วน
data class CacheKey(val userId: Long, val resourceType: String)
val cache = HashMap<CacheKey, ByteArray>()
val key = CacheKey(42, "avatar")
cache[key] = byteArrayOf(1, 2, 3)
println(cache[CacheKey(42, "avatar")] != null)  // true

distinct กับคลาสข้อมูล

distinct() บนรายการคลาสข้อมูลจะใช้ equals ของคลาสข้อมูลเพื่อลบค่าซ้ำ
data class Event(val type: String, val ts: Long)
val events = listOf(
    Event("click", 1000),
    Event("click", 1000),  // duplicate
    Event("scroll", 2000)
)
println(events.distinct().size)  // 2

คีย์ที่ไม่เปลี่ยนแปลงปลอดภัยกว่า

ใช้คลาสข้อมูลที่มีพร็อพเพอร์ตี val เป็นคีย์ของแมปหรือเซตเสมอ การเปลี่ยนแปลงคีย์หลังการแทรกจะทำให้โครงสร้างข้อมูลเสียหาย
data class ImmutableKey(val id: Int)  // val properties only
// DON'T: data class MutableKey(var id: Int)  // changing id breaks map!

ตรวจสอบอย่างรวดเร็ว

เหตุใดคลาสข้อมูลจึงทำงานได้อย่างถูกต้องเมื่อเป็นคีย์ของแมป ในขณะที่คลาสทั่วไปมักทำงานไม่ถูกต้อง

สรุปทบทวน

คลาสข้อมูลใช้เป็นคีย์ของแมปและสมาชิกของเซตได้ เพราะมี equals และ hashCode เชิงโครงสร้างที่ถูกต้อง ใช้พร็อพเพอร์ตี val เพื่อให้คีย์ไม่เปลี่ยนแปลง ใช้ groupBy, distinct และ sortedBy ร่วมกับคลาสข้อมูลเพื่อสร้างการค้นหาที่มีประสิทธิภาพ

คำถามที่พบบ่อย

บทเรียน “Data Class ในคอลเลกชันและในฐานะคีย์ของ Map” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Data Class ในคอลเลกชันและในฐานะคีย์ของ Map” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Data Class ในคอลเลกชันและในฐานะคีย์ของ Map”

ใช้ data class ในเซตและแผนที่โดยอาศัยความเท่าเทียมเชิงโครงสร้าง คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “Data Class ในคอลเลกชันและในฐานะคีย์ของ Map” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน Data Class: เมธอดที่สร้างอัตโนมัติ
  2. การคัดลอกด้วย copy() และการเขียนทับบางส่วน
  3. การประกาศแบบแยกโครงสร้างด้วย componentN
  4. Data Class ในคอลเลกชันและในฐานะคีย์ของ Map
← กลับไปที่ Kotlin Academy