Kotlin处理多重字符串串联的方式是什么?
--edit--放置导致我怀疑的那段代码
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()
}
一个StringBuilder的是建立在科特林一个字符串,如Java的标准方式。
(当然,除非可以一行完成,否则字符串模板通常比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
,然后返回生成的String。(因此length
,lastOrNull()
和append
参考StringBuilder的。)
对于短代码,这可以更加简洁明了。尽管使用更长的代码的好处并不清楚。(您的代码可能在...之间的灰色区域中)
值得指出的是,函数名称具有误导性:它避免了重复的字符,但允许不连续的重复项。如果这是故意的,那么值得在函数名称(和/或其文档注释)中明确说明。或者,如果要避免所有重复,则存在一种更简单和/或更有效的方法:洗改范围(或至少范围的一部分)。
使用现有的库函数,并使其成为CharRange的扩展函数,整个过程可能很简单:
fun CharRange.randomChars(n: Int) = shuffled().take(n).joinToString("")
即使只需要几个字符,也可以使整个列表混乱。因此,只洗洗所需的部分将更加有效。但是没有库函数,因此您必须手动编写。我将其保留为练习!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句