Quiero combinar dos listas de diferentes longitudes. Por ejemplo;
val list1 = listOf(1,2,3,4,5) val list2 = listOf("a","b","c")quiero salir asi
(1,"a",2,"b",3,"c",4,5)¿Hay alguna sugerencia?
Puede usar la función .zip para eso
list1.zip(list2){ a,b -> listOf(a,b)}.flatten()El único problema es que solo procesará elementos, con ambos conjuntos, por lo que si (como en el ejemplo) tenemos un tamaño diferente, no funcionará
La alternativa podría ser agregar marcadores específicos y filtrarlos o simplemente usar iteradores para eso. Encontré una solución elegante con la función de sequence{..}
val result = sequence { val first = list1.iterator() val second = list2.iterator() while (first.hasNext() && second.hasNext()) { yield(first.next()) yield(second.next()) } yieldAll(first) yieldAll(second) }.toList() >>> list1 + list2 res12: kotlin.collections.List<kotlin.Any> = [1, 2, 3, 4, 5, a, b, c] >>> list1.zip(list2).flatMap { listOf(it.first, it.second) } + list1.drop(list2.size) res16: kotlin.collections.List<kotlin.Any> = [1, a, 2, b, 3, c, 4, 5]Podrías hacerlo así:
val mergedList = with(setOf(list1, list2).sortedByDescending { it.count() }) { first().mapIndexed { index, e -> listOfNotNull(e, last().getOrNull(index)) } }.flatten() Primero, coloca ambas listas en un Set , luego las ordena (descendentemente) por el número de elementos que producen una lista de listas.
La primera lista que tiene la mayoría de los elementos se utilizará para la iteración.
Usando mapIndexed puede usar el index para acceder al elemento correspondiente en la segunda lista. Si no hay ninguno, se devuelve null y listOfNotNull lo filtrará. Al final, aplanas la lista de listas resultante y obtienes el resultado deseado:
[1, a, 2, b, 3, c, 4, 5]