الدالة CharSequence.groupBy()‎ في Kotlin

من موسوعة حسوب

تجمِّع الدالة groupBy()‎ محارف السلسلة التي استُدعيت معها في مجموعات، إذ تطبق دالة محدَّدة على كل عنصر ثمَّ تعاد خريطة تحوي مجموعاتٍ مفتاحُ كلِّ واحدةٍ منها مرتبطٌ بقائمة من المحارف المقابلة.

تحافظ الخريطة المُعادة على على ترتيب التكرار (entry iteration order) للمفاتيح الناتجة عن سلسلة المحارف الأصلية.

البنية العامة

inline fun <K> CharSequence.groupBy(
    keySelector: (Char) -> K
): Map<K, List<Char>>

inline fun <K, V> CharSequence.groupBy(
    keySelector: (Char) -> K, 
    valueTransform: (Char) -> V
): Map<K, List<V>>

يُلاحَظ وجود الكلمة المفتاحية inline للدلالة على أن هذه الدالة مباشرة، وللمزيد من التفاصيل راجع توثيق الدوال المباشرة (inline functions).

المعاملات

keySelector

دالةٌ تطبق على كل محرف من محارف السلسلة المعطاة، وتعيد المفتاح المقابل لكل محرف.

valueTransform

دالة تطبق على كل محرف من محارف السلسلة المعطاة، وتعيد القيمة المقابلة لكل محرف.

القيم المعادة

إن مُرِّر إلى الدالة groupBy()‎ المعامل keySelector فقط، فستُجمّع محارف السلسلة المعطاة بحسب المفتاح الذي تعيده الدالة keySelector‎ المطبقة على كل محرف من تلك المحارف ثمَّ تعاد خريطة تحوي مجموعاتٍ مفتاحُ كلِّ واحدةٍ منها مرتبطٌ بقائمة من المحارف المقابلة.

أمَّا إن مرِّر إلى الدالة groupBy()‎ المعاملين valueTransform و keySelector، فستُجمّع محارف السلسلة المعطاة بحسب القيم التي تعيدها الدالة valueTransform المطبقة على كل محرف من تلك المحارف وبحسب المفتاح الذي تعيده الدالة keySelector المطبقة على المحرف نفسه ثمَّ تعاد خريطة تحوي مجموعاتٍ مفتاحُ كلِّ واحدةٍ منها مرتبطٌ بقائمة من المحارف المعادة المقابلة.

أمثلة

مثالٌ على استعمال الدالة ()groupBy مع تمرير معامل واحد إليه:

fun main(args: Array<String>) {
    val str = "abcdsafddssfghjjffhgggfeeregtgggfgddghhgfdqdgdg"

    print(str.groupBy { it.toByte() } )
}

ناتج تنفيذ هذا المثال هو:

{97=[a, a], 98=[b], 99=[c], 100=[d, d, d, d, d, d, d, d], 115=[s, s, s], 102=[f, f, f, f, f, f, f], 103=[g, g, g, g, g, g, g, g, g, g, g, g, g], 104=[h, h, h, h], 106=[j, j], 101=[e, e, e], 114=[r], 116=[t], 113=[q]}

مثالٌ على استعمال الدالة ()groupBy مع تمرير معاملين إليه:

fun main(args: Array<String>) {
    val str = "abcdsafddssfghjjffhgggfeeregtgggfgddghhgfdqdgdg"

    print(str.groupBy({ it.toByte() }, { it.toUpperCase() }))
}

ناتج تنفيذ هذا المثال هو:

{97=[A, A], 98=[B], 99=[C], 100=[D, D, D, D, D, D, D, D], 115=[S, S, S], 102=[F, F, F, F, F, F, F], 103=[G, G, G, G, G, G, G, G, G, G, G, G, G], 104=[H, H, H, H], 106=[J, J], 101=[E, E, E], 114=[R], 116=[T], 113=[Q]}

انظر أيضًا

  • الدالة groupByTo()‎: تشبه الدالة groupBy()‎ في جميع النواحي باستثناء أنَّها تضيف الناتج المعاد إلى المعامل الممرَّر إليها.
  • الدالة groupingBy()‎: تُنشئ موردًا (source) من النوع Grouping من سلسلة المحارف التي استُدعيت معها لاستخدامه لاحقًا مع عمليات التجميع (group-and-fold operations) وذلك باستخدام الدالة keySelector المُمرّرة إليها لاستخلاص مفتاح من كل محرف.

مصادر