الدالة windowed()‎ في Kotlin

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

تعيد الدالة windowed()‎ قائمة تحتوي على سلاسل نصية بحجم معين ثابت جلبت من سلسلة المحارف التي استدعيت معها عند التحرك بخطوات محددة ثابتة، أو تحوي ناتج تطبيق دالة معينة على تلك السلاسل النصية المجلوبة.

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

fun CharSequence.windowed(
    size: Int, 
    step: Int = 1, 
    partialWindows: Boolean = false
): List<String>

الإصدار المطلوب: Kotlin 1.2. تعيد الدالة windowed()‎ قائمة مكونة من سلاسل نصية حجم كل منها يساوي size جلبت من سلسلة المحارف التي استُدعيت معها في كل مرة تقفز فيها الدالة بخطوة ثابتة مقدارها step من المحارف. السلسة النصية الأخيرة المتبقية قد يكون طولها أقل من size، وتضاف إلى القيم المعادة إن كانت قيمة المعامل partialWindows هي true.

fun <R> CharSequence.windowed(
    size: Int, 
    step: Int = 1, 
    partialWindows: Boolean = false, 
    transform: (CharSequence) -> R
): List<R>

الإصدار المطلوب: Kotlin 1.2.

تعيد الدالة windowed()‎ قائمة تحتوي على نتائج تطبيق الدالة transform على سلاسل نصية حجم كل منها يساوي size جلبت من سلسلة المحارف التي استُدعيت معها في كل مرة تقفز فيها الدالة بخطوة ثابتة مقدارها step من المحارف. السلسة النصية الأخيرة المتبقية قد يكون طولها أقل من size، وتضاف إلى القيم المعادة إن كانت قيمة المعامل partialWindows هي true.

المعاملات

size

عدد صحيح موجب يحدد حجم السلاسل النصية المراد جلبها عند كل خطوة.

step

عدد صحيح موجب يحدد عدد الخطوات التي يراد أن تجلب عند كل منها سلسلة نصية بحجم size. القيمة الافتراضية هي: 1 (أي التحرك بمقدار محرف واحد).

partialWindows

قيمة منطقية تحدد إن كان يراد جلب السلسلة النصية الأخيرة المتبقية أم لا. القيمة الافتراضية هي: false (أي إهمال الجزء الأخير المتبقي).

transform

دالة تطبق على كل سلسلة نصية جلبت عند كل خطوة وتعيد القيمة المقابلة لها.

لاحظ أنّ سلسلة المحارف المُمرّرة إلى الدالة transform سريعة الزوال (ephemeral)، وهي متاحة فقط داخل الدالة. بناءً على ذلك، لا يجب عليك أن تُخزَّن بأي طريقة، إلا إن أعددت مقتطفًا (snapshot) منها.

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

تعاد قائمة تحتوي على سلاسل نصية حجم كل منها size جلبت من سلسلة المحارف المعطاة عند التحرك بخطوات ثابتة مقدار كل منها step، أو يعاد ناتج تطبيق الدالة transform على سلاسل نصية حجم كل منها size جلبت من سلسلة المحارف المعطاة عند التحرك بخطوات ثابتة مقدار كل منها step.

أمثلة

مثالٌ على استعمال الدالة ()windowed:

fun main(args: Array<String>) {
    val sequence = generateSequence(1) { it + 1 }

    val windows = sequence.windowed(size = 5, step = 1)
    println(windows.take(4).toList()) // [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8]]

    val moreSparseWindows = sequence.windowed(size = 5, step = 3)
    println(moreSparseWindows.take(4).toList()) // [[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10, 11], [10, 11, 12, 13, 14]]

    val fullWindows = sequence.take(10).windowed(size = 5, step = 3)
    println(fullWindows.toList()) // [[1, 2, 3, 4, 5], [4, 5, 6, 7, 8]]

    val partialWindows = sequence.take(10).windowed(size = 5, step = 3, partialWindows = true)
    println(partialWindows.toList()) // [[1, 2, 3, 4, 5], [4, 5, 6, 7, 8], [7, 8, 9, 10], [10]]
}

مثالٌ على استعمال الدالة ()windowed مع تمرير دالة:

fun main(args: Array<String>) {
    val dataPoints = sequenceOf(10, 15, 18, 25, 19, 21, 14, 8, 5)

    val averaged = dataPoints.windowed(size = 4, step = 1, partialWindows = true) { window -> window.average() }
    println(averaged.toList()) // [17.0, 19.25, 20.75, 19.75, 15.5, 12.0, 9.0, 6.5, 5.0]

    val averagedNoPartialWindows = dataPoints.windowed(size = 4, step = 1).map { it.average() }
    println(averagedNoPartialWindows.toList()) // [17.0, 19.25, 20.75, 19.75, 15.5, 12.0]
}

انظر أيضًا

  • الدالة windowedSequence()‎ : تعيد سلسلة تحتوي على سلاسل نصية بحجم معين ثابت جلبت من سلسلة المحارف التي استدعيت معها عند التحرك بخطوات محددة ثابتة، أو تحوي ناتج تطبيق دالة معينة على تلك السلاسل النصية المجلوبة.
  • الدالة trim(): تحذف المحارف المحققة لشرط معين، أو محارف محددة، أو المسافات الفارغة من بداية ونهاية سلسلة المحارف أو السلسلة النصية التي استُدعيت معها.

مصادر