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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث

تنشئ الدالة zip()‎ أزواجًا من عناصر كائنين لها نفس الفهرس، أو تنشئ قيمًا عبر تمرير عناصر لها نفس الفهرس تجلب من كائنين مختلفين إلى دالة معينة.

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

إن استدعيت الدالة zip()‎ مع مصفوفة ومع تمرير مصفوفة أخرى إليها كوسيط، فستشكل أزواجًا من عناصر هاتين المصفوفتين التي لها نفس الفهرس وتضعها في قائمة؛ طول القائمة المعادة يساوي طول أٌقصرهما.

infix fun <T, R> Array<out T>.zip(
    other: Array<out R>
): List<Pair<T, R>> 
infix fun <R> ByteArray.zip(
    other: Array<out R>
): List<Pair<Byte, R>> 
infix fun <R> ShortArray.zip(
    other: Array<out R>
): List<Pair<Short, R>> 
infix fun <R> IntArray.zip(
    other: Array<out R>
): List<Pair<Int, R>> 
infix fun <R> LongArray.zip(
    other: Array<out R>
): List<Pair<Long, R>> 
infix fun <R> FloatArray.zip(
    other: Array<out R>
): List<Pair<Float, R>> 
infix fun <R> DoubleArray.zip(
    other: Array<out R>
): List<Pair<Double, R>> 
infix fun <R> BooleanArray.zip(
    other: Array<out R>
): List<Pair<Boolean, R>> 
infix fun <R> CharArray.zip(
    other: Array<out R>
): List<Pair<Char, R>> 
infix fun ByteArray.zip(
    other: ByteArray
): List<Pair<Byte, Byte>> 
infix fun ShortArray.zip(
    other: ShortArray
): List<Pair<Short, Short>> 
infix fun IntArray.zip(other: IntArray): List<Pair<Int, Int>> 
infix fun LongArray.zip(
    other: LongArray
): List<Pair<Long, Long>> 
infix fun FloatArray.zip(
    other: FloatArray
): List<Pair<Float, Float>> 
infix fun DoubleArray.zip(
    other: DoubleArray
): List<Pair<Double, Double>> 
infix fun BooleanArray.zip(
    other: BooleanArray
): List<Pair<Boolean, Boolean>> 
infix fun CharArray.zip(
    other: CharArray
): List<Pair<Char, Char>>

وإن استدعيت الدالة zip()‎ مع مصفوفة ومع تمرير مجموعة تكرارية إليها كوسيط، فستشكل أزواجًا من عناصر المصفوفة والمجموعة التي لها نفس الفهرس وتضعها في قائمة؛ طول القائمة المعادة يساوي طول أٌقصرهما.

infix fun <T, R> Array<out T>.zip(
    other: Iterable<R>
): List<Pair<T, R>>
infix fun <R> ByteArray.zip(
    other: Iterable<R>
): List<Pair<Byte, R>> 
infix fun <R> ShortArray.zip(
    other: Iterable<R>
): List<Pair<Short, R>> 
infix fun <R> IntArray.zip(
    other: Iterable<R>
): List<Pair<Int, R>> 
infix fun <R> LongArray.zip(
    other: Iterable<R>
): List<Pair<Long, R>> 
infix fun <R> FloatArray.zip(
    other: Iterable<R>
): List<Pair<Float, R>> 
infix fun <R> DoubleArray.zip(
    other: Iterable<R>
): List<Pair<Double, R>> 
infix fun <R> BooleanArray.zip(
    other: Iterable<R>
): List<Pair<Boolean, R>>
infix fun <R> CharArray.zip(
    other: Iterable<R>
): List<Pair<Char, R>>

وإن استدعيت الدالة zip()‎ مع مجموعة تكرارية ومع تمرير مصفوفة إليها كوسيط، فستشكل أزواجًا من عناصر تلك المجموعة والمصفوفة التي لها نفس الفهرس وتضعها في قائمة؛ طول القائمة المعادة يساوي طول أٌقصرهما.

infix fun <T, R> Iterable<T>.zip(
    other: Array<out R>
): List<Pair<T, R>>

وإن استدعيت الدالة zip()‎ مع مجموعة تكرارية ومع تمرير مجموعة تكرارية أخرى إليها كوسيط، فستشكل أزواجًا من عناصر هاتين المجموعتين التي لها نفس الفهرس وتضعها في قائمة؛ طول القائمة المعادة يساوي طول أٌقصرهما.

infix fun <T, R> Iterable<T>.zip(
    other: Iterable<R>
): List<Pair<T, R>>

وإن استدعيت الدالة zip()‎ مع مصفوفة ومع تمرير مصفوفة ودالة إليها كوسيطين، فستعيد قائمة تحوي قيمًا منشأة من تمرير عناصر هاتين المصفوفتين التي لها نفس الفهرس إلى تلك الدالة المعطاة؛ طول القائمة المعادة يساوي طول أٌقصرهما.

inline fun <T, R, V> Array<out T>.zip(
    other: Array<out R>, 
    transform: (a: T, b: R) -> V
): List<V> 
inline fun <R, V> ByteArray.zip(
    other: Array<out R>, 
    transform: (a: Byte, b: R) -> V
): List<V> 
inline fun <R, V> ShortArray.zip(
    other: Array<out R>, 
    transform: (a: Short, b: R) -> V
): List<V> 
inline fun <R, V> IntArray.zip(
    other: Array<out R>, 
    transform: (a: Int, b: R) -> V
): List<V> 
inline fun <R, V> LongArray.zip(
    other: Array<out R>, 
    transform: (a: Long, b: R) -> V
): List<V> 
inline fun <R, V> FloatArray.zip(
    other: Array<out R>, 
    transform: (a: Float, b: R) -> V
): List<V>
inline fun <R, V> DoubleArray.zip(
    other: Array<out R>, 
    transform: (a: Double, b: R) -> V
): List<V> 
inline fun <R, V> BooleanArray.zip(
    other: Array<out R>, 
    transform: (a: Boolean, b: R) -> V
): List<V> 
inline fun <R, V> CharArray.zip(
    other: Array<out R>, 
    transform: (a: Char, b: R) -> V
): List<V> 
inline fun <V> ByteArray.zip(
    other: ByteArray, 
    transform: (a: Byte, b: Byte) -> V
): List<V> 
inline fun <V> ShortArray.zip(
    other: ShortArray, 
    transform: (a: Short, b: Short) -> V
): List<V> 
inline fun <V> IntArray.zip(
    other: IntArray, 
    transform: (a: Int, b: Int) -> V
): List<V> 
inline fun <V> LongArray.zip(
    other: LongArray, 
    transform: (a: Long, b: Long) -> V
): List<V> 
inline fun <V> FloatArray.zip(
    other: FloatArray, 
    transform: (a: Float, b: Float) -> V
): List<V> 
inline fun <V> DoubleArray.zip(
    other: DoubleArray, 
    transform: (a: Double, b: Double) -> V
): List<V> 
inline fun <V> BooleanArray.zip(
    other: BooleanArray, 
    transform: (a: Boolean, b: Boolean) -> V
): List<V> 
inline fun <V> CharArray.zip(
    other: CharArray, 
    transform: (a: Char, b: Char) -> V
): List<V>

وإن استدعيت الدالة zip()‎ مع مصفوفة ومع تمرير مجموعة تكرارية ودالة كوسيطين، فستعيد قائمة تحوي قيمًا منشأة من تمرير عناصر هذه المصفوفة والمجموعة التي لها نفس الفهرس إلى تلك الدالة المعطاة؛ طول القائمة المعادة يساوي طول أٌقصرهما.

inline fun <T, R, V> Array<out T>.zip(
    other: Iterable<R>, 
    transform: (a: T, b: R) -> V
): List<V> 
inline fun <R, V> ByteArray.zip(
    other: Iterable<R>, 
    transform: (a: Byte, b: R) -> V
): List<V> 
inline fun <R, V> ShortArray.zip(
    other: Iterable<R>, 
    transform: (a: Short, b: R) -> V
): List<V> 
inline fun <R, V> IntArray.zip(
    other: Iterable<R>, 
    transform: (a: Int, b: R) -> V
): List<V>
inline fun <R, V> LongArray.zip(
    other: Iterable<R>, 
    transform: (a: Long, b: R) -> V
): List<V> 
inline fun <R, V> FloatArray.zip(
    other: Iterable<R>, 
    transform: (a: Float, b: R) -> V
): List<V> 
inline fun <R, V> DoubleArray.zip(
    other: Iterable<R>, 
    transform: (a: Double, b: R) -> V
): List<V> 
inline fun <R, V> BooleanArray.zip(
    other: Iterable<R>, 
    transform: (a: Boolean, b: R) -> V
): List<V> 
inline fun <R, V> CharArray.zip(
    other: Iterable<R>, 
    transform: (a: Char, b: R) -> V
): List<V>

وإن استدعيت الدالة zip()‎ مع مجموعة تكرارية ومع تمرير مصفوفة ودالة كوسيطين، فستعيد قائمة تحوي قيمًا منشأة من تمرير عناصر هذه المجموعة والمصفوفة التي لها نفس الفهرس إلى تلك الدالة المعطاة؛ طول القائمة المعادة يساوي طول أٌقصرهما.

inline fun <T, R, V> Iterable<T>.zip(
    other: Array<out R>, 
    transform: (a: T, b: R) -> V
): List<V>

في حال استدعاء الدالة zip()‎ مع مجموعة تكرارية ومع تمرير مجموعة تكرارية ودالة كوسيطين، فستعيد قائمة تحوي قيمًا منشأة من تمرير عناصر هاتين المجموعتين التي لها نفس الفهرس إلى تلك الدالة المعطاة؛ طول القائمة المعادة يساوي طول أٌقصرهما.

inline fun <T, R, V> Iterable<T>.zip(
    other: Iterable<R>, 
    transform: (a: T, b: R) -> V
): List<V>

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

المعاملات

other

الكائن الآخر الذي ستطبق عليها العملية.

transform

الدالة التي سيمرر إليها العنصران اللذان يملكان الفهرس نفسه ثم تعيد القيمة المقابلة لهما.

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

تعاد قائمة تحوي أزواجًا منشأة من عناصر الكائنين المعطيين التي لها نفس الفهرس، أو تعاد قائمة من قيمٍ منشأة عبر تمرير عناصر هذين الكائنين التي لها نفس الفهرس إلى الدالة transform (ارجع إلى قسم "البنية العامة" للمزيد من التفصيل).

أمثلة

استعمال الدالة ()zip لتشكيل أزواج من قيم قائمتين:

fun main(args: Array<String>) {
    val listA = listOf("a", "b", "c")
    val listB = listOf(1, 2, 3, 4)

    println(listA zip listB) // [(a, 1), (b, 2), (c, 3)]
}

استعمال الدالة ()zip لتشكيل قيم مؤلفة من عنصرين يؤخذ كلٌّ منهما من قائمة معينة:

fun main(args: Array<String>) {
    val listA = listOf("a", "b", "c")
    val listB = listOf(1, 2, 3, 4)
    val result = listA.zip(listB) { a, b -> "$a$b" }

    println(result) // [a1, b2, c3]
}

انظر أيضًا

  • الدالة unzip()‎ : تعيد قائمتين، إذ تحتوي الأولى على القيم الأولى لكل زوج من أزواج المصفوفة أو المجموعة التكرارية التي استُدعيت معها وتحتوي الثانية على القيم الثانية لكل زوج من تلك الأزواج.
  • الدالة union()‎ : تجمع العناصر المشتركة وغير المتشركة بين المصفوفة أو المجموعة التكرارية التي استُدعيت معها وبين المجموعة التكرارية المُمرّرة إليها في مجموعةٍ واحدةٍ من النوع Set بعد حذف العناصر المتكررة.

مصادر