|
|
(5 مراجعات متوسطة بواسطة 3 مستخدمين غير معروضة) |
سطر 1: |
سطر 1: |
| <noinclude>{{DISPLAYTITLE: الدالة <code>groupingBy()</code> في لغة Kotlin}}</noinclude> | | <noinclude>{{DISPLAYTITLE: الدالة <code>groupingBy()</code> في Kotlin}}</noinclude> |
| يخت
| | تُنشئ الدالة <code>groupingBy()</code> موردًا (source) من النوع <code>Grouping</code> من [[Kotlin/Array|المصفوفة]] أو [[Kotlin/collections|المجموعة]] التي استُدعيت معها لاستخدامه لاحقًا مع عمليات التجميع (group-and-fold operations) وذلك باستخدام الدالة <code>keySelector</code> المُمرّرة إليها لاستخلاص مفتاح من كل عنصر. |
| | ==البنية العامة== |
| | '''الإصدار المطلوب''': Kotlin 1.1. |
|
| |
|
| تجمّع الدالة<code>groupingBy()</code> عناصر [[Kotlin/Array|المصفوفة]] أو [[Kotlin/collections|المجموعة]] التي استُدعيت عبرها وتضيفها إلى [[Kotlin/collections/Map|القاموس]].المُمرّر <code>destination</code> حيث مفاتيحه تعيدها الدالة الممرّرة <code>keySelector()</code> مُطبّقة على كل عناصر [[Kotlin/Array|المصفوفة]] أو [[Kotlin/collections|المجموعة]]، وقيمُه [[Kotlin/collections/List|لوائح]] تضم العناصر المقابلة، وفي حال تمرير معامل ثالث <code>valueTransform</code> فإنّ القيم ستكون [[Kotlin/collections/List|لوائح]] تضم ناتج تطبيق الدالة <code>valueTransform</code> على العناصر المقابلة . ثم تعيد القاموس<code>destination.</code>
| | يمكن استدعاء الدالة <code>groupByTo()</code> مع [[Kotlin/Array|المصفوفات]] و<nowiki/>[[Kotlin/Array|المجموعات]]:<syntaxhighlight lang="kotlin"> |
| ==البنية العامة==
| | inline fun <T, K> Array<out T>.groupingBy( |
| <syntaxhighlight lang="kotlin"> | | crossinline keySelector: (T) -> K |
| inline fun <T, K, M : MutableMap<in K, MutableList<T>>> Array<out T>.groupByTo( | | ): Grouping<T, K> |
| destination: M, | | |
| keySelector: (T) -> K
| | inline fun <T, K> Iterable<T>.groupingBy( |
| ): M | | crossinline keySelector: (T) -> K |
| inline fun <K, M : MutableMap<in K, MutableList<Byte>>> ByteArray.groupByTo(
| | ): Grouping<T, K> |
| destination: M,
| | </syntaxhighlight>وجود الكلمة المفتاحية <code>inline</code> يدل على أنَّ هذه الدالة مباشرة (للمزيد من التفاصيل، راجع صفحة <nowiki/>[[Kotlin/inline functions|الدوال المباشرة (inline functions)]]). |
| keySelector: (Byte) -> K
| |
| ): M
| |
| inline fun <K, M : MutableMap<in K, MutableList<Short>>> ShortArray.groupByTo( | |
| destination: M, | |
| keySelector: (Short) -> K
| |
| ): M | |
| inline fun <K, M : MutableMap<in K, MutableList<Int>>> IntArray.groupByTo(
| |
| destination: M,
| |
| keySelector: (Int) -> K
| |
| ): M
| |
| inline fun <K, M : MutableMap<in K, MutableList<Long>>> LongArray.groupByTo(
| |
| destination: M,
| |
| keySelector: (Long) -> K
| |
| ): M
| |
| inline fun <K, M : MutableMap<in K, MutableList<Float>>> FloatArray.groupByTo( | |
| destination: M,
| |
| keySelector: (Float) -> K
| |
| ): M
| |
| inline fun <K, M : MutableMap<in K, MutableList<Double>>> DoubleArray.groupByTo( | |
| destination: M,
| |
| keySelector: (Double) -> K
| |
| ): M
| |
| inline fun <K, M : MutableMap<in K, MutableList<Boolean>>> BooleanArray.groupByTo( | |
| destination: M,
| |
| keySelector: (Boolean) -> K
| |
| ): M | |
| inline fun <K, M : MutableMap<in K, MutableList<Char>>> CharArray.groupByTo(
| |
| destination: M,
| |
| keySelector: (Char) -> K
| |
| ): M
| |
|
| |
|
| </syntaxhighlight>في حال استدعاء الدالة<code>groupByTo()</code> على [[Kotlin/Array|المصفوفات]] مع تمرير معاملين <code>destination</code> و<code>keySelector</code> فإنّها تُجمّع عناصر [[Kotlin/Array|المصفوفة]] الأصلية وتضيفها إلى [[Kotlin/collections/Map|القاموس]].المُمرّر <code>destination</code> حيث مفاتيحه تعيدها الدالة الممرّرة <code>keySelector()</code> مُطبّقة على كل عناصر [[Kotlin/Array|المصفوفة]] وقيمه [[Kotlin/collections/List|لوائح]] تضم العناصر المقابلة. ثم تعيد القاموس<code>destination.</code><syntaxhighlight lang="kotlin">
| | == المعاملات == |
| inline fun <T, K, V, M : MutableMap<in K, MutableList<V>>> Array<out T>.groupByTo(
| |
| destination: M,
| |
| keySelector: (T) -> K,
| |
| valueTransform: (T) -> V
| |
| ): M
| |
| inline fun <K, V, M : MutableMap<in K, MutableList<V>>> ByteArray.groupByTo(
| |
| destination: M,
| |
| keySelector: (Byte) -> K,
| |
| valueTransform: (Byte) -> V
| |
| ): M
| |
| inline fun <K, V, M : MutableMap<in K, MutableList<V>>> ShortArray.groupByTo(
| |
| destination: M,
| |
| keySelector: (Short) -> K,
| |
| valueTransform: (Short) -> V
| |
| ): M
| |
| inline fun <K, V, M : MutableMap<in K, MutableList<V>>> IntArray.groupByTo(
| |
| destination: M,
| |
| keySelector: (Int) -> K,
| |
| valueTransform: (Int) -> V
| |
| ): M
| |
| inline fun <K, V, M : MutableMap<in K, MutableList<V>>> LongArray.groupByTo(
| |
| destination: M,
| |
| keySelector: (Long) -> K,
| |
| valueTransform: (Long) -> V
| |
| ): M
| |
| inline fun <K, V, M : MutableMap<in K, MutableList<V>>> FloatArray.groupByTo(
| |
| destination: M,
| |
| keySelector: (Float) -> K,
| |
| valueTransform: (Float) -> V
| |
| ): M
| |
| inline fun <K, V, M : MutableMap<in K, MutableList<V>>> DoubleArray.groupByTo(
| |
| destination: M,
| |
| keySelector: (Double) -> K,
| |
| valueTransform: (Double) -> V
| |
| ): M
| |
| inline fun <K, V, M : MutableMap<in K, MutableList<V>>> BooleanArray.groupByTo(
| |
| destination: M,
| |
| keySelector: (Boolean) -> K,
| |
| valueTransform: (Boolean) -> V
| |
| ): M
| |
| inline fun <K, V, M : MutableMap<in K, MutableList<V>>> CharArray.groupByTo(
| |
| destination: M,
| |
| keySelector: (Char) -> K,
| |
| valueTransform: (Char) -> V
| |
| ): M
| |
|
| |
|
| </syntaxhighlight>في حال استدعاء الدالة<code>groupByTo()</code> على [[Kotlin/Array|المصفوفات]] مع تمرير ثلاث معاملات <code>destination</code> و <code>valueTransform</code> و <code>keySelector</code> فإنّها تُجمّع العناصر المعادة من قبل الدالة <code>valueTransform()</code> مُطبّقة على كل عناصر [[Kotlin/Array|المصفوفة]] وتربطها بالمفتاح الذي تعيده الدالة<code>keySelector()</code> مطبقة على على عناصر [[Kotlin/Array|المصفوفة]] وتضيفها إلى [[Kotlin/collections/Map|القاموس]] المُمرّر <code>destination</code> حيث كل مفتاح مرتبط [[Kotlin/collections/List|بلائحة]] العناصر المقابلة. ثم تعيد [[Kotlin/collections/Map|القاموس]] <code>destination.</code><syntaxhighlight lang="kotlin">
| | === <code>keySelector</code> === |
| inline fun <T, K> Iterable<T>.groupBy(
| | الدالة المستعملة في استخلاص مفتاح من كل عنصر. |
| keySelector: (T) -> K
| |
| ): Map<K, List<T>>
| |
| </syntaxhighlight>في حال استدعاء الدالة<code>groupByTo()</code> على [[Kotlin/collections|المجموعات]] مع تمرير معاملين <code>destination</code> و<code>keySelector</code> فإنّها تُجمّع عناصر [[Kotlin/collections|المجموعة]] الأصلية وتضيفها إلى [[Kotlin/collections/Map|القاموس]].المُمرّر <code>destination</code> حيث مفاتيحه تعيدها الدالة الممرّرة <code>keySelector()</code> مُطبّقة على كل عناصر [[Kotlin/collections|المجموعة]] وقيمه [[Kotlin/collections/List|لوائح]] تضم العناصر المقابلة. ثم تعيد القاموس<code>destination.</code><syntaxhighlight lang="kotlin">
| |
| inline fun <T, K, V> Iterable<T>.groupBy(
| |
| keySelector: (T) -> K,
| |
| valueTransform: (T) -> V
| |
| ): Map<K, List<V>>
| |
| </syntaxhighlight>في حال استدعاء الدالة<code>groupByTo()</code> على [[Kotlin/collections|المجموعات]] مع تمرير ثلاث معاملات <code>destination</code> و <code>valueTransform</code> و <code>keySelector</code> فإنّها تُجمّع العناصر المعادة من قبل الدالة <code>valueTransform()</code> مُطبّقة على كل عناصر [[Kotlin/collections|المجموعة]] وتربطها بالمفتاح الذي تعيده الدالة<code>keySelector()</code> مطبقة على على عناصر [[Kotlin/collections|المجموعة]] وتضيفها إلى [[Kotlin/collections/Map|القاموس]] المُمرّر <code>destination</code> حيث كل مفتاح مرتبط [[Kotlin/collections/List|بلائحة]] العناصر المقابلة. ثم تعيد [[Kotlin/collections/Map|القاموس]] <code>destination</code>.
| |
|
| |
|
| يُلاحَظ وجود الكلمة المفتاحية <code>inline</code> للدلالة على أن هذه الدالة مباشرة، وللمزيد من التفاصيل راجع <nowiki/>[[Kotlin/inline functions|توثيق الدوال المباشرة (inline functions)]].
| | ==القيم المعادة== |
| ==القيم المٌعادة==
| | يُعاد موردٌ من النوع <code>Grouping</code> من [[Kotlin/Array|المصفوفة]] أو [[Kotlin/collections|المجموعة]] المعطاة لاستخدامه لاحقًا مع عمليات التجميع (group-and-fold). |
| [[Kotlin/collections/Map|القاموس]] <code>destination</code> المُمرّر إلى الدالة<code>()groupByTo</code>. | |
| ==أمثلة== | | ==أمثلة== |
| ===استخدام الدالة <code>()groupByTo</code> مع المصفوفات مع تمرير معاملين===
| | توضح الشيفرة الآتية كيفيَّة إنشاء كائن من النوع <code>Grouping</code> باستخدام الدالة <code>()groupingBy</code> يستعمل لتجميع الأحرف الأولى من كل سلسلة نصية بحسب عدد مرات تكرارها:<syntaxhighlight lang="kotlin"> |
| تعرف الشيفرة الآتية <nowiki/>[[Kotlin/Array|مصفوفة]] باسم <code>array</code> مكونة من ست [[Kotlin/collections/String|سلاسل نصية]] باستخدام الدالة <code>()arrayOf</code>، ثم تُنشئ [[Kotlin/collections/Map|قاموسًا]] فارغًا باسم <code>map</code> باستخدام الدالة <code>()mutableMapOf</code>، ثم تستخدم الدالة <code>()groupByTo</code> على <code>array</code> بتمرير [[Kotlin/collections/Map|القاموس]] <code>map</code> و دالة تعيد طول [[Kotlin/collections/String|السلسلة النصية]] المُمرّرة، ثم تطبع [[Kotlin/collections/Map|القاموس]] <code>map</code>:<syntaxhighlight lang="kotlin">
| |
| fun main(args: Array<String>) { | | fun main(args: Array<String>) { |
| val array = arrayOf("a", "abc", "ab", "def","avde" ,"abcd") | | val words = "one two three four five six seven eight nine ten".split(' ') |
| val map: MutableMap<Int, MutableList<String>> = mutableMapOf() | | val frequenciesByFirstChar = words.groupingBy { it.first() }.eachCount() |
|
| | println("Counting first letters:") |
| array.groupByTo ( map, { it.length })
| | println(frequenciesByFirstChar) // {o=1, t=3, f=2, s=2, e=1, n=1} |
| | | |
| print(map) // {1=[a], 3=[abc, def], 2=[ab], 4=[avde, abcd]}
| | val moreWords = "eleven twelve".split(' ') |
| }
| | val moreFrequencies = moreWords.groupingBy { it.first() }.eachCountTo(frequenciesByFirstChar.toMutableMap()) |
| </syntaxhighlight>
| | println(moreFrequencies) // {o=1, t=4, f=2, s=2, e=2, n=1} |
| ===استخدام الدالة <code>()groupingBy</code> مع المصفوفات مع تمرير ثلاث معاملات===
| |
| تعرف الشيفرة الآتية <nowiki/>[[Kotlin/Array|مصفوفة]] باسم <code>array</code> مكونة من ست [[Kotlin/collections/String|سلاسل نصية]] باستخدام الدالة <code>()arrayOf</code>، ثم تُنشئ [[Kotlin/collections/Map|قاموسًا]] فارغًا باسم <code>map</code> باستخدام الدالة <code>()mutableMapOf</code>، ثم تستدعي الدالة <code>()groupingBy</code> على <code>array</code> بتمرير [[Kotlin/collections/Map|القاموس]] <code>map</code> و دالة تعيد طول [[Kotlin/collections/String|السلسلة النصية]] المُمرّرة ودالة تحوّل [[Kotlin/collections/String|السلاسل النصية]] إلى [[Kotlin/collections/String|سلاسل نصية]] ذات حروف كبيرة ، ثم تطبع [[Kotlin/collections/Map|القاموس]] <code>map</code>:<syntaxhighlight lang="kotlin">
| |
| fun main(args: Array<String>) {
| |
| val array = arrayOf("a", "abc", "ab", "def","avde" ,"abcd") | |
| val map: MutableMap<Int, MutableList<String>> = mutableMapOf()
| |
|
| |
| array.groupByTo ( map, { it.length }, {it.toUpperCase()})
| |
| | |
| print(map) // {1=[A], 3=[ABC, DEF], 2=[AB], 4=[AVDE, ABCD]}
| |
| } | | } |
| </syntaxhighlight> | | </syntaxhighlight> |
| ==انظر أيضًا== | | ==انظر أيضًا== |
| <code>[[Kotlin/collections/groupByTo|groupBy()]]</code>: تعيد [[Kotlin/collections/Map|قاموسًا]] يُجمّع عناصر [[Kotlin/Array|المصفوفة]] أو [[Kotlin/collections|المجموعة]] التي استُدعيت عبرها حيث مفاتيحه تعيدها الدالة المُمرّرة <code>keySelector</code> وقيمه لوائحُ تضم عناصر [[Kotlin/Array|المصفوفة]] أو [[Kotlin/collections|المجموعة]] (أو ناتج تمرير عناصر [[Kotlin/Array|المصفوفة]] أو [[Kotlin/collections|المجموعة]] على الدالة <code>valueTransform</code> في حال تمريرها). | | * الدالة <code>[[Kotlin/collections/groupBy|groupBy()]]</code> : تجمِّع عناصر [[Kotlin/Array|المصفوفة]] أو [[Kotlin/collections|المجموعة]] التي استُدعيت معها في مجموعات، إذ تطبق دالة محدَّدة على كل عنصر ثمَّ تعاد خريطة تحوي مجموعاتٍ مفتاحُ كلِّ واحدةٍ منها مرتبطٌ بقائمة من العناصر المقابلة. |
| | |
| | * الدالة <code>[[Kotlin/collections/groupByTo|groupByTo()]]</code>: تشبه الدالة <code>[[Kotlin/collections/groupBy|groupBy()]]</code> في جميع النواحي باستثناء أنَّها تضيف الناتج المعاد إلى المعامل الممرَّر إليها. |
| | * الدالة <code>[[Kotlin/collections/foldRightIndexed|foldRightIndexed()]]</code>: تجمع ناتج تطبيق عملية معينة على قيمة كل عنصر من عناصر المصفوفة أو المجموعة (بدءًا من اليمين إلى اليسار) المستدعاة معها وفهرس ذلك العنصر بشكل تراكمي بالإضافة إلى القيمة الأولية إن أعطيت. |
| | * الدالة <code>[[Kotlin/collections/foldRight|foldRight()]]</code>: تجمع بشكل تراكمي ناتج تطبيق عملية معيَّنة على قيمة كل عنصر من عناصر المصفوفة أو المجموعة (بدءًا من اليمين إلى اليسار) المستدعاة معها والقيمة التراكمية الحالية بالإضافة إلى القيمة الأولية إن أعطيت. |
| | |
| ==مصادر== | | ==مصادر== |
| [https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by-to.html الدالة groupingBy() في التوثيق الرسمي للمكتبة القياسية في لغة Kotlin] | | * [https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/grouping-by.html صفحة الدالة groupingBy() في التوثيق الرسمي للمكتبة القياسية في لغة Kotlin] |
| [[تصنيف:Kotlin]] | | [[تصنيف:Kotlin]] |
| [[تصنيف:Kotlin Functions]] | | [[تصنيف:Kotlin Function]] |
| | [[تصنيف:Kotlin Collection]] |
تُنشئ الدالة groupingBy()
موردًا (source) من النوع Grouping
من المصفوفة أو المجموعة التي استُدعيت معها لاستخدامه لاحقًا مع عمليات التجميع (group-and-fold operations) وذلك باستخدام الدالة keySelector
المُمرّرة إليها لاستخلاص مفتاح من كل عنصر.
البنية العامة
الإصدار المطلوب: Kotlin 1.1.
يمكن استدعاء الدالة groupByTo()
مع المصفوفات والمجموعات:
inline fun <T, K> Array<out T>.groupingBy(
crossinline keySelector: (T) -> K
): Grouping<T, K>
inline fun <T, K> Iterable<T>.groupingBy(
crossinline keySelector: (T) -> K
): Grouping<T, K>
وجود الكلمة المفتاحية inline
يدل على أنَّ هذه الدالة مباشرة (للمزيد من التفاصيل، راجع صفحة الدوال المباشرة (inline functions)).
المعاملات
keySelector
الدالة المستعملة في استخلاص مفتاح من كل عنصر.
القيم المعادة
يُعاد موردٌ من النوع Grouping
من المصفوفة أو المجموعة المعطاة لاستخدامه لاحقًا مع عمليات التجميع (group-and-fold).
أمثلة
توضح الشيفرة الآتية كيفيَّة إنشاء كائن من النوع Grouping
باستخدام الدالة ()groupingBy
يستعمل لتجميع الأحرف الأولى من كل سلسلة نصية بحسب عدد مرات تكرارها:
fun main(args: Array<String>) {
val words = "one two three four five six seven eight nine ten".split(' ')
val frequenciesByFirstChar = words.groupingBy { it.first() }.eachCount()
println("Counting first letters:")
println(frequenciesByFirstChar) // {o=1, t=3, f=2, s=2, e=1, n=1}
val moreWords = "eleven twelve".split(' ')
val moreFrequencies = moreWords.groupingBy { it.first() }.eachCountTo(frequenciesByFirstChar.toMutableMap())
println(moreFrequencies) // {o=1, t=4, f=2, s=2, e=2, n=1}
}
انظر أيضًا
- الدالة
groupBy()
: تجمِّع عناصر المصفوفة أو المجموعة التي استُدعيت معها في مجموعات، إذ تطبق دالة محدَّدة على كل عنصر ثمَّ تعاد خريطة تحوي مجموعاتٍ مفتاحُ كلِّ واحدةٍ منها مرتبطٌ بقائمة من العناصر المقابلة.
- الدالة
groupByTo()
: تشبه الدالة groupBy()
في جميع النواحي باستثناء أنَّها تضيف الناتج المعاد إلى المعامل الممرَّر إليها.
- الدالة
foldRightIndexed()
: تجمع ناتج تطبيق عملية معينة على قيمة كل عنصر من عناصر المصفوفة أو المجموعة (بدءًا من اليمين إلى اليسار) المستدعاة معها وفهرس ذلك العنصر بشكل تراكمي بالإضافة إلى القيمة الأولية إن أعطيت.
- الدالة
foldRight()
: تجمع بشكل تراكمي ناتج تطبيق عملية معيَّنة على قيمة كل عنصر من عناصر المصفوفة أو المجموعة (بدءًا من اليمين إلى اليسار) المستدعاة معها والقيمة التراكمية الحالية بالإضافة إلى القيمة الأولية إن أعطيت.
مصادر