如何解决StringBuffer 是 Kotlin 处理多个字符串连接的方式吗?
kotlin 处理多个字符串连接的方法是什么?
--编辑-- 放置导致我怀疑的代码
fun getNCharsFromrange(n: Int,range: CharRange): String {
val chars = range.toList()
val buffer = StringBuffer()
while (buffer.length < n) {
val randomInt = Random.Default.nextInt(0,chars.lastIndex)
val newchar = chars[randomInt]
val lastChar = buffer.lastOrNull() ?: ""
if (newchar != lastChar) {
buffer.append(newchar)
}
}
return buffer.toString()
}
解决方法
A StringBuilder 是在 Kotlin 中构造字符串的标准方式,就像在 Java 中一样。
(当然,除非它可以在一行中完成,其中 string template 通常比 Java 样式的连接更好。)
Kotlin 有一个改进,不过:您可以使用 buildString
隐式处理它,这可以使代码更简洁一些。例如,您的代码可以写成:
fun getNCharsFromRange(n: Int,range: CharRange): String {
val chars = range.toList()
return buildString {
while (length < n) {
val randomInt = Random.Default.nextInt(0,chars.lastIndex)
val newChar = chars[randomInt]
val lastChar = lastOrNull() ?: ""
if (newChar != lastChar)
append(newChar)
}
}
}
没有提到 buffer
:相反,buildString
创建了一个 StringBuilder,使其作为 this
可用,然后返回结果字符串。 (所以 length
、lastOrNull()
和 append
指的是 StringBuilder。)
对于短代码,这可以明显更简洁明了;尽管更长的代码带来的好处不那么明显。 (您的代码可能位于...之间的灰色区域)
值得指出的是,函数名具有误导性:它避免了重复字符,但允许不连续的重复。如果这是故意的,那么值得在函数名称(和/或其文档注释)中明确说明。或者,如果目的是避免所有重复,那么有一种更简单和/或更有效的方法:对范围(或至少其中的一部分)进行混洗。
使用现有的库函数,并使其成为 CharRange 上的扩展函数,整个过程可以如此简单:
fun CharRange.randomChars(n: Int) = shuffled().take(n).joinToString("")
这会打乱整个列表,即使只需要几个字符。所以只对需要的部分进行洗牌会更有效率。但是没有库函数,所以你必须手动编写。我将把它留作练习!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。