微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

StringBuffer 是 Kotlin 处理多个字符串连接的方式吗?

如何解决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 可用,然后返回结果字符串。 (所以 lengthlastOrNull()append 指的是 StringBuilder。)

对于短代码,这可以明显更简洁明了;尽管更长的代码带来的好处不那么明显。 (您的代码可能位于...之间的灰色区域)


值得指出的是,函数名具有误导性:它避免了重复字符,但允许不连续的重复。如果这是故意的,那么值得在函数名称(和/或其文档注释)中明确说明。或者,如果目的是避免所有重复,那么有一种更简单和/或更有效的方法:对范围(或至少其中的一部分)进行混洗。

使用现有的库函数,并使其成为 CharRange 上的扩展函数,整个过程可以如此简单:

fun CharRange.randomChars(n: Int) = shuffled().take(n).joinToString("")

这会打乱整个列表,即使只需要几个字符。所以只对需要的部分进行洗牌会更有效率。但是没有库函数,所以你必须手动编写。我将把它留作练习!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。