التجميع والترتيب
groupBy وsortBy
التجميع والترتيب درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
تنظيم البيانات
غالبًا ما تحتاج البيانات الواقعية إلى التجميع حسب خاصية أو الفرز حسب مفتاح. توفّر مجموعات Scala الدوال groupBy وsortBy وsortWith وغيرها لتنفيذ ذلك بطريقة تصريحية.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(5, 3, 8, 1, 9, 2)
println(nums.sorted)
}
}sorted: الترتيب الطبيعي
ترتّب sorted العناصر وفق ترتيبها الطبيعي؛ تصاعديًا للأعداد وأبجديًا للسلاسل النصية. وهي تحتاج إلى ترتيب متاح للأنواع الشائعة.
object Main {
def main(args: Array[String]): Unit = {
println(List(3, 1, 2).sorted)
println(List("pear", "apple", "fig").sorted)
}
}sortBy: الفرز حسب مفتاح
تفرز sortBy العناصر حسب قيمة مُشتقة من كل عنصر. عليكم توفير دالة تستخرج مفتاح الفرز.
object Main {
def main(args: Array[String]): Unit = {
val words = List("banana", "fig", "apple")
val byLength = words.sortBy(_.length)
println(byLength)
}
}الفرز ترتيبًا تنازليًا
للفرز ترتيبًا تنازليًا، اعكس إشارة مفتاح عددي أو استخدم sorted(Ordering.Int.reverse). وبالنسبة إلى المفاتيح المشتقة، يكون استخدام sortBy مع إشارة السالب موجزًا.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(5, 3, 8, 1)
println(nums.sortBy(-_))
println(nums.sorted(Ordering.Int.reverse))
}
}sortWith: مُقارِن مخصّص
تأخذ sortWith دالة تُعيد true عندما ينبغي أن تأتي الوسيطة الأولى قبل الثانية، مما يمنحكم تحكمًا كاملًا في الترتيب.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(5, 3, 8, 1)
val descending = nums.sortWith((a, b) => a > b)
println(descending)
}
}الفرز حسب مفاتيح متعددة
يمكن لـ sortBy إعادة tuple للفرز حسب عدة مفاتيح دفعةً واحدة: إذ تقارن العنصر الأول، ثم الثاني لكسر حالات التعادل.
object Main {
def main(args: Array[String]): Unit = {
val people = List(("Ann", 30), ("Bob", 25), ("Ann", 22))
val sorted = people.sortBy { case (name, age) => (name, age) }
println(sorted)
}
}groupBy: التقسيم إلى Map
تُعيد groupBy قيمة Map يكون كل مفتاح فيها ناتج دالتكم، وتكون كل قيمة قائمة العناصر التي تشترك في ذلك المفتاح.
object Main {
def main(args: Array[String]): Unit = {
val nums = List(1, 2, 3, 4, 5, 6)
val byParity = nums.groupBy(_ % 2 == 0)
println(byParity)
}
}التجميع حسب مفتاح محسوب
يمكن أن يكون مفتاح التجميع أي شيء: الحرف الأول أو الطول أو الفئة. ويصبح كل مفتاح مميّز حاويةً مستقلة.
object Main {
def main(args: Array[String]): Unit = {
val words = List("apple", "avocado", "banana", "cherry", "cranberry")
val byFirstLetter = words.groupBy(_.head)
byFirstLetter.foreach { case (letter, ws) => println(s"$letter -> $ws") }
}
}تحويل المجموعات
بعد التجميع، سترغبون غالبًا في تلخيص كل حاوية. استخدموا view.mapValues (أو map) لتحويل القيم، مثل عدّ العناصر في كل مجموعة.
object Main {
def main(args: Array[String]): Unit = {
val words = List("cat", "car", "dog", "deer", "cow")
val counts = words.groupBy(_.head).view.mapValues(_.size).toMap
println(counts)
}
}groupMapReduce في خطوة واحدة
تجمع groupMapReduce العناصر، وتحول كل عنصر، ثم تختزل قيم كل مجموعة، وكل ذلك في مرور واحد. وهي طريقة موجزة لإنشاء ملخصات مثل مجاميع كل فئة.
object Main {
def main(args: Array[String]): Unit = {
val sales = List(("books", 10), ("toys", 5), ("books", 7), ("toys", 3))
val totals = sales.groupMapReduce(_._1)(_._2)(_ + _)
println(totals)
}
}دمج التجميع والفرز
من الأنماط الشائعة: تجميع البيانات، وتلخيص كل مجموعة، ثم فرز الملخص. نعدّ هنا الكلمات حسب الحرف الأول، ثم نفرز حسب العدد.
object Main {
def main(args: Array[String]): Unit = {
val words = List("apple", "avocado", "banana", "cherry", "cranberry", "apricot")
val ranked = words
.groupBy(_.head)
.view.mapValues(_.size).toList
.sortBy(-_._2)
println(ranked)
}
}اختبار سريع
ماذا تُعيد List(1,2,3,4).groupBy(_ % 2 == 0)؟
مراجعة
لقد تعلّمتم التجميع والفرز:
sorted— الترتيب الطبيعيsortBy— الفرز حسب مفتاح مشتق، مع استخدام tuple للمفاتيح المتعددةsortWith— مُقارِن مخصّصgroupBy— التقسيم إلىMapمن الحاوياتgroupMapReduce— التجميع والتحويل والاختزال في مرور واحد
الأسئلة الشائعة
هل درس «التجميع والترتيب» مجاني؟
نعم — نص درس «التجميع والترتيب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «التجميع والترتيب»؟
groupBy وsortBy تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التجميع والترتيب»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- List وVector وSet وMap
- التحويلات
- الطي والاختزال
- التجميع والترتيب