我认为 Eugenes 的答案已经包含了组合两个列表所需的所有知识(无论是 zip 还是组合所有元素)。
如果您想组合任意数量的列表,每个交替列表一个项目,您可能还对以下方法感兴趣:
fun combine(vararg lists: List<*>) : List<Any> = mutableListOf<Any>().also {
combine(it, lists.map(List<*>::iterator))
}
private tailrec fun combine(targetList: MutableList<Any>, iterators: List<Iterator<*>>) {
iterators.asSequence()
.filter(Iterator<*>::hasNext)
.mapNotNull(Iterator<*>::next)
.forEach { targetList += it }
if (iterators.asSequence().any(Iterator<*>::hasNext))
combine(targetList, iterators)
}
然后调用它看起来如下并导致评论中看到的值:
combine(list1, list2) // List containing: 1, "a", 2, "b", 3, "c", 4, 5
combine(list1, list2, listOf("hello", "world")) // 1, "a", "hello", 2, "b", "world", 3, "c", 4, 5
可以使用以下代码实现 Eugenes 答案第二部分的简化方法;当然,当你得到一个列表时,它不再懒惰了;-)(但也许你甚至将它直接翻译成一个列表,所以你也可以使用这种方法):
fun List<Any>.combine(other: List<Any>) : List<Any> = mutableListOf<Any>().also {
val first = iterator()
val second = other.iterator()
while (first.hasNext() || second.hasNext()) {
if (first.hasNext()) it.add(first.next())
if (second.hasNext()) it.add(second.next())
}
}
调用它的工作方式如下:
list1.combine(list2)