ตัวดำเนินการเปรียบเทียบ
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟังก์ชันตัวดำเนินการ
- ตัวดำเนินการเปรียบเทียบ
- ดัชนีและการเรียกใช้งาน
- แนวปฏิบัติที่ดี