Я думаю, что ответ Евгения уже содержит все, что вам нужно знать, чтобы объединить два списка (будь то 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
Упрощенный подход ко второй части ответа Евгения может быть реализован с использованием следующего кода; это, конечно, больше не лень, когда вы получаете список обратно ;-) (но, возможно, вы даже перевели его прямо в список, так что вы также можете использовать этот подход):
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)