邮编3个等长列表 [英] Zip 3 lists of equal length

查看:48
本文介绍了邮编3个等长列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Kotlin stdlib中是否有一个标准操作,可以对3个(或更多)列表的zip进行迭代?

Is there a standard operation in Kotlin stdlib which would allow to iterate over a zip of 3 (or more) lists?

它应该有效:

list1.zip(list2).zip(list3) { (a, b), c -> listOf(a, b, c)}

推荐答案

以下是标准库样式的函数.我并不是说这些是特别优化的,但我认为它们至少很容易理解.

Here are functions in the style of the standard library that do this. I'm not saying these are particularly optimized, but I think they're at least easy to understand.

/**
 * Returns a list of lists, each built from elements of all lists with the same indexes.
 * Output has length of shortest input list.
 */
public inline fun <T> zip(vararg lists: List<T>): List<List<T>> {
    return zip(*lists, transform = { it })
}

/**
 * Returns a list of values built from elements of all lists with same indexes using provided [transform].
 * Output has length of shortest input list.
 */
public inline fun <T, V> zip(vararg lists: List<T>, transform: (List<T>) -> V): List<V> {
    val minSize = lists.map(List<T>::size).min() ?: return emptyList()
    val list = ArrayList<V>(minSize)

    val iterators = lists.map { it.iterator() }
    var i = 0
    while (i < minSize) {
        list.add(transform(iterators.map { it.next() }))
        i++
    }

    return list
}

用法:

val list1 = listOf(1, 2, 3, 4)
val list2 = listOf(5, 6)
val list3 = listOf(7, 8, 9)

println(zip(list1, list2, list3)) // [[1, 5, 7], [2, 6, 8]]

这篇关于邮编3个等长列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆