معاملات المقارنة
compareTo وequals
معاملات المقارنة درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
مقارنة الأنواع المخصصة
لاستخدام < و> و<= و>= مع نوعك، عرّف operator fun compareTo تُرجع قيمة من نوع Int.
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
بمجرد أن يصبح النوع 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))
}الأسئلة الشائعة
هل درس «معاملات المقارنة» مجاني؟
نعم — نص درس «معاملات المقارنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «معاملات المقارنة»؟
compareTo وequals تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «معاملات المقارنة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- دوال المعاملات
- معاملات المقارنة
- الفهرسة والاستدعاء
- أفضل الممارسات