【发布时间】:2019-06-29 05:39:48
【问题描述】:
我有两个字符串
val a = "abc"
val b = "xyz"
我想合并它并需要如下输出
axbycz
我将两个字符串都添加到数组列表中,然后对其进行平面映射
val c = listOf(a, b)
val d = c.flatMap {
it.toList()
}
但没有得到想要的结果
【问题讨论】:
我有两个字符串
val a = "abc"
val b = "xyz"
我想合并它并需要如下输出
axbycz
我将两个字符串都添加到数组列表中,然后对其进行平面映射
val c = listOf(a, b)
val d = c.flatMap {
it.toList()
}
但没有得到想要的结果
【问题讨论】:
marstran 的回答非常简洁,Pawels 的回答非常快。使用buildString,您可以两全其美:
buildString {
a.zip(b).forEach { (a, b) ->
append(a).append(b)
}
}
buildString 创建一个 StringBuilder 并将其作为 lambda 中的接收者提供。它返回构建的字符串。
在这里试试:Kotlin Playground。感谢 Pawel 创建原始基准。
【讨论】:
使用zip 函数。它创建一个带有“相邻”字母的对列表。然后,您可以将joinToString 与转换器一起使用来创建最终结果。
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 separator
【讨论】:
zip 直接作为Iterable<Char> 作用于字符串,就像在许多FP 语言中一样。我有一个类似的解决方案,但我正在做 a.toList() 和 b.toList()。
CharSequences。
假设两个字符串的大小相同,您始终可以使用简单的循环。这样你只分配一个StringBuilder 和计数器变量,没有任何lists、arrays 或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()
【讨论】: