tengo dos cuerdas
val a = "abc" val b = "xyz"Quiero fusionarlo y necesito una salida como la siguiente
axbycz
Agregué ambas cadenas a la lista de arreglos y luego la mapeé plana
val c = listOf(a, b) val d = c.flatMap { it.toList() }pero no obtener el resultado deseado
Usa la función zip . Crea una lista de pares con letras "adyacentes". Luego puede usar joinToString con un transformador para crear su resultado final.
a.zip(b) // Returns the list [(a, x), (b, y), (c, z)] .joinToString("") { (a, b) -> "$a$b" } // Joins the list back to a string with no separatorSiempre puede usar un bucle simple, suponiendo que ambas cadenas tengan el mismo tamaño. De esa manera, solo asigna un StringBuilder y una variable de contador, sin lists , arrays o pairs :
val a = "abc" val b = "xyz" val sb = StringBuilder() for(i in 0 until a.length){ sb.append(a[i]).append(b[i]) } val d = sb.toString()La respuesta de marstran es realmente concisa y la respuesta de Pawels es realmente rápida. Usando buildString puedes tener lo mejor de ambos mundos:
buildString { a.zip(b).forEach { (a, b) -> append(a).append(b) } } buildString crea un StringBuilder y lo ofrece como receptor en el lambda. Devuelve la cadena construida.
Pruébalo aquí: Kotlin Playground . Gracias a Pawel por crear el benchmark original.