【问题标题】:Merge two strings in kotlin在kotlin中合并两个字符串
【发布时间】:2019-06-29 05:39:48
【问题描述】:

我有两个字符串

val a = "abc"
val b = "xyz"

我想合并它并需要如下输出

axbycz

我将两个字符串都添加到数组列表中,然后对其进行平面映射

val c = listOf(a, b)

val d = c.flatMap {
    it.toList()
}

但没有得到想要的结果

【问题讨论】:

    标签: string arraylist kotlin


    【解决方案1】:

    marstran 的回答非常简洁,Pawels 的回答非常快。使用buildString,您可以两全其美:

    buildString {
        a.zip(b).forEach { (a, b) ->
            append(a).append(b)
        }
    }
    

    buildString 创建一个 StringBuilder 并将其作为 lambda 中的接收者提供。它返回构建的字符串。

    在这里试试:Kotlin Playground。感谢 Pawel 创建原始基准。

    【讨论】:

      【解决方案2】:

      使用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()
      • @m0skit0 正是我的想法,真的很好:)
      • @m0skit0 Kotlin 提供overloads for CharSequences
      【解决方案3】:

      假设两个字符串的大小相同,您始终可以使用简单的循环。这样你只分配一个StringBuilder 和计数器变量,没有任何listsarrayspairs

      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()
      

      【讨论】:

      • 有效但不惯用。这是用 Kotlin 编写的 Java。
      • @m0skit0 效率更高,但对于小型数据集可能无关紧要。我在 JVM 中运行了这个并接受了 1000 万次的答案——循环平均 340 毫秒,压缩 840 毫秒。输入 184 个字符的字符串循环为 9.5 秒,压缩 31 秒。
      • @Pawel 我也考虑过性能。看看我的回答
      • @WilliMentzel 我以前在本地做,但如果你想亲自看看:playground
      • @Pawel 我学到了两件事:我的是最慢的(我删除了我的答案 xD),而你的是最快的,肯定要快得多,以至于我会为此牺牲可读性(尽管我认为它的可读性很好):) thx 基准 +1
      猜你喜欢
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 2011-03-25
      • 2017-08-12
      相关资源
      最近更新 更多