【问题标题】:Add spaces using kotlin string functions/string format使用 kotlin 字符串函数/字符串格式添加空格
【发布时间】:2020-08-25 20:54:33
【问题描述】:

这可能在这里被问过几次.. 我想在字符串的每四个字符之间添加空格(8888319024981442)。我的字符串长度正好是 16。String.format 没有帮助

避免使用拆分或在内存中创建多个字符串。

有没有可以快速使用的kotlin函数/String.format。

【问题讨论】:

    标签: string kotlin replaceall string.format


    【解决方案1】:

    我不认为有一种非常简单的方法可以做到这一点,但是有传统的方法:

    val number = "8888319024981442"
    val list = mutableListOf<String>()
    for (i in 0..3) { list.add(number.substring(i*4, (i+1)*4))}
    println(list.joinToString(" "))
    

    编辑

    或者@IR42 简单回答

    number.chunked(4).joinToString(separator = " ")
    

    【讨论】:

    • number.chunked(4).joinToString(separator = " ")
    • 我认为您的第一种方法除了必要的StringBuilder 和结果String 之外,还会创建一个临时的ArrayList、一个IntRange 和四个子Strings...
    • 对于数字,它不包含 4 的精确倍数,最好使用 number.reversed().chunked(4).joinToString(" ").reversed() 它显示“123 4567 " 而不是错误的 "1234 567"
    【解决方案2】:

    我不认为有一个既简单又优雅的答案并且避免所有临时对象。

    对于前者,IR42 使用chunked() 可能是最好的。

    这是对后者的一次尝试:

    val number = "8888319024981442"
    val result = buildString {
        for (i in 0 until number.length) {
            if (i % 4 == 0 && i > 0)
                append(' ')
            append(number[i])
        }
    }
    println(result) // '8888 3190 2498 1442'
    

    这只会创建一个StringBuilder,然后从中创建一个String——这是可能的最小值*。这有点丑陋和冗长,但如果避免所有临时对象真的很重要**,那么这可能是你能做的最好的事情了。

    (* 或者至少是给定条件下可能的最小值。为了获得更好的性能,请考虑在不创建 String 的情况下传递 StringBuilder 本身。更好的是,使用现有的 StringBuilder 而不是创建一个。当然,所有这些都需要更改周围的代码。)

    (** 虽然在某些情况下这 非常重要,但实际上它们非常不寻常。我会 recommend 使用简单版本,直到您完成一些分析并证明这是一个瓶颈,而复杂版本在您的情况下确实表现得更好。即便如此,将其折叠成一个实用函数以保持主代码清晰。)

    【讨论】:

      猜你喜欢
      • 2023-02-01
      • 2022-07-25
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      相关资源
      最近更新 更多