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

ตัวดำเนินการเปรียบเทียบ

compareTo และ equals

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

การเปรียบเทียบชนิดข้อมูลกำหนดเอง

หากต้องการใช้ <, >, <=, >= กับชนิดข้อมูลของคุณ ให้กำหนด operator fun compareTo ที่ส่งคืนค่าเป็นจำนวนเต็ม

data class Money(val cents: Int) {
    operator fun compareTo(o: Money) = cents - o.cents
}

fun main() {
    println(Money(500) > Money(200))
}

สัญญาของ compareTo

compareTo จะส่งคืนค่าลบหากตัวรับมีค่าน้อยกว่า ศูนย์หากเท่ากัน และค่าบวกหากมีค่ามากกว่า

data class Version(val n: Int) {
    operator fun compareTo(o: Version) = n - o.n
}

fun main() {
    println(Version(2).compareTo(Version(5)))
}

การใช้งาน Comparable

การใช้งานอินเทอร์เฟซ Comparable<T> เป็นแนวทางตามแบบแผน โดย compareTo ของอินเทอร์เฟซนี้เป็นตัวดำเนินการอยู่แล้ว

data class Score(val value: Int) : Comparable<Score> {
    override fun compareTo(other: Score) = value - other.value
}

fun main() {
    println(Score(10) < Score(20))
}

การเรียงลำดับด้วย Comparable

เมื่อชนิดข้อมูลรองรับการเปรียบเทียบแล้ว ฟังก์ชันของคอลเลกชันอย่าง sorted() จะทำงานโดยอัตโนมัติ

data class Player(val rank: Int) : Comparable<Player> {
    override fun compareTo(other: Player) = rank - other.rank
}

fun main() {
    val sorted = listOf(Player(3), Player(1), Player(2)).sorted()
    println(sorted.map { it.rank })
}

การใช้ compareValuesBy

สำหรับการเปรียบเทียบหลายฟิลด์ compareValuesBy จะเปรียบเทียบตามตัวเลือกแต่ละตัวตามลำดับ

data class Person(val age: Int, val name: String) : Comparable<Person> {
    override fun compareTo(other: Person) =
        compareValuesBy(this, other, { it.age }, { it.name })
}

fun main() {
    println(Person(30, "Al") < Person(30, "Bo"))
}

ความเท่ากันด้วย equals

ตัวดำเนินการ == จะเรียก equals ไม่ใช่ compareTo ให้เขียนทับ equals เพื่อควบคุมความเท่ากันของค่า

class Id(val value: Int) {
    override fun equals(other: Any?) =
        other is Id && other.value == value
    override fun hashCode() = value
}

fun main() {
    println(Id(7) == Id(7))
}

equals และ hashCode ต้องใช้คู่กัน

หากคุณเขียนทับ equals คุณต้องเขียนทับ hashCode ด้วย เพื่อให้ออบเจ็กต์ที่เท่ากันมีค่าแฮชเดียวกัน และทำให้คอลเลกชันที่อาศัยแฮชทำงานได้ถูกต้อง

class Tag(val name: String) {
    override fun equals(other: Any?) = other is Tag && other.name == name
    override fun hashCode() = name.hashCode()
}

fun main() {
    val set = hashSetOf(Tag("a"), Tag("a"))
    println(set.size)
}

คลาสข้อมูลจัดการให้โดยอัตโนมัติ

data class จะสร้าง equals และ hashCode จากพร็อพเพอร์ตีโดยอัตโนมัติ ดังนั้น == จึงเปรียบเทียบค่าของออบเจ็กต์

data class Coord(val x: Int, val y: Int)

fun main() {
    println(Coord(1, 2) == Coord(1, 2))
}

ความเท่ากันเทียบกับเอกลักษณ์

== จะเรียก equals เพื่อเปรียบเทียบค่า ส่วน === จะตรวจสอบเอกลักษณ์ของการอ้างอิง ทั้งสองอย่างอาจให้ผลแตกต่างกัน

data class Box(val n: Int)

fun main() {
    val a = Box(1)
    val b = Box(1)
    println(a == b)
    println(a === b)
}

การเปรียบเทียบในเงื่อนไข

เมื่อกำหนด compareTo แล้ว ชนิดข้อมูลของคุณจะใช้งานใน if และ when ได้เหมือนตัวเลข

data class Weight(val g: Int) : Comparable<Weight> {
    override fun compareTo(other: Weight) = g - other.g
}

fun main() {
    val w = Weight(50)
    println(if (w > Weight(40)) "heavy" else "light")
}

maxOf และ minOf

ชนิดข้อมูลที่รองรับการเปรียบเทียบสามารถใช้ร่วมกับ maxOf และ minOf ได้

data class T(val v: Int) : Comparable<T> {
    override fun compareTo(other: T) = v - other.v
}

fun main() {
    println(maxOf(T(3), T(8)).v)
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับตัวดำเนินการเปรียบเทียบของคุณ

สรุปทบทวน

คุณได้เรียนรู้เกี่ยวกับ ตัวดำเนินการเปรียบเทียบ:

  • compareTo รองรับ <, >, <=, >= และส่งคืนค่าลบ ศูนย์ หรือค่าบวก
  • ใช้งาน Comparable<T> เพื่อจัดลำดับและเรียงลำดับตามแบบแผน
  • == ใช้ equals และควรใช้คู่กับ hashCode เสมอ
  • คลาสข้อมูลจะสร้าง equals/hashCode โดยอัตโนมัติ
data class S(val v: Int) : Comparable<S> {
    override fun compareTo(other: S) = v - other.v
}

fun main() {
    println(S(2) < S(5))
}

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

บทเรียน “ตัวดำเนินการเปรียบเทียบ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ตัวดำเนินการเปรียบเทียบ”

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

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

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

บทเรียน “ตัวดำเนินการเปรียบเทียบ” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ฟังก์ชันตัวดำเนินการ
  2. ตัวดำเนินการเปรียบเทียบ
  3. ดัชนีและการเรียกใช้งาน
  4. แนวปฏิบัติที่ดี
← กลับไปที่ Kotlin Academy