【发布时间】:2020-08-25 20:54:33
【问题描述】:
这可能在这里被问过几次.. 我想在字符串的每四个字符之间添加空格(8888319024981442)。我的字符串长度正好是 16。String.format 没有帮助
避免使用拆分或在内存中创建多个字符串。
有没有可以快速使用的kotlin函数/String.format。
【问题讨论】:
标签: string kotlin replaceall string.format
这可能在这里被问过几次.. 我想在字符串的每四个字符之间添加空格(8888319024981442)。我的字符串长度正好是 16。String.format 没有帮助
避免使用拆分或在内存中创建多个字符串。
有没有可以快速使用的kotlin函数/String.format。
【问题讨论】:
标签: string kotlin replaceall string.format
我不认为有一种非常简单的方法可以做到这一点,但是有传统的方法:
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...
我不认为有一个既简单又优雅的答案并且避免所有临时对象。
对于前者,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 使用简单版本,直到您完成一些分析并证明这是一个瓶颈,而复杂版本在您的情况下确实表现得更好。即便如此,将其折叠成一个实用函数以保持主代码清晰。)
【讨论】: