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

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

تشبه الدالة groupByTo()‎ الدالة groupBy()‎ في جميع النواحي باستثناء أنَّها تضيف الناتج المعاد إلى المعامل الممرَّر إليها.

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

inline fun <K, M : MutableMap<in K, MutableList<Char>>> CharSequence.groupByTo(
    destination: M, 
    keySelector: (Char) -> K
): M

inline fun <K, V, M : MutableMap<in K, MutableList<V>>> CharSequence.groupByTo(
    destination: M, 
    keySelector: (Char) -> K, 
    valueTransform: (Char) -> V
): M

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

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

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

المعاملات

destination

خريطة من النوع MutableMap تمثل الوجهة التي سيُضَاف الناتج فيها.

keySelector

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

valueTransform

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

أمثلة

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

fun main(args: Array<String>) {
    val str = "abcdsafddssfghjjffhgggfeeregtgggfgddghhgfdqdgdg"
    val map: MutableMap<Byte, MutableList<Char>> = mutableMapOf()

    str.groupByTo(map) { it.toByte() }
    print(map)
}

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

{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 مع تمرير جميع المعاملات إليه:

fun main(args: Array<String>) {
    val str = "abcdsafddssfghjjffhgggfeeregtgggfgddghhgfdqdgdg"
    val map: MutableMap<Byte, MutableList<Char>> = mutableMapOf()

    str.groupByTo(map, { it.toByte() }, { it.toUpperCase() })
    print(map)
}

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

{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()‎: تجمِّع محارف السلسلة التي استُدعيت معها في مجموعات، إذ تطبق دالة محدَّدة على كل عنصر ثمَّ تعاد خريطة تحوي مجموعاتٍ مفتاحُ كلِّ واحدةٍ منها مرتبطٌ بقائمة من المحارف المقابلة.
  • الدالة groupingBy()‎: تُنشئ موردًا (source) من النوع Grouping من سلسلة المحارف التي استُدعيت معها لاستخدامه لاحقًا مع عمليات التجميع (group-and-fold operations) وذلك باستخدام الدالة keySelector المُمرّرة إليها لاستخلاص مفتاح من كل محرف.

مصادر