如何在 Kotlin 中将字符串句子转换为 ArrayList?

5
我有一个将字符串句子转换为单词列表的函数。我用Java编写了这个函数,并使用Android Studio中默认的Kotlin转换将其转换为Kotlin,但我相信在Awesome Kotlin中有许多缩短此代码的方法。如果您可以分享您的代码片段并帮助我(和所有人)提高我们在Kotlin上的知识水平,那就太好了。
private fun stringToWords(mnemonic: String): List<String> {
    val words = ArrayList<String>()
    for (word in mnemonic.trim { it <= ' ' }.split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()) {
        if (word.isNotEmpty()) {
            words.add(word)
        }
    }
    return words
}

1
您能分享一下原始的Java函数吗? - Abdul-Aziz-Niazi
https://gist.github.com/januprasad/8e4f2a8f520e0f8839bbe8e23496ac04 - J.K
4个回答

21

我会选择以下内容:

fun stringToWords(s : String) = s.trim().splitToSequence(' ')
    .filter { it.isNotEmpty() } // or: .filter { it.isNotBlank() }
    .toList()
请注意您可能需要调整该过滤器,例如也过滤掉空白条目... 我把那个变量放在了注释中...(如果您使用它,则不需要初始的 trim())。
如果您更愿意使用 Sequence,只需省略末尾的 .toList() 即可。
还有,正如 Abdul-Aziz-Niazi 所说:如果您经常需要此操作,您也可以通过扩展函数实现相同的功能。
fun String.toWords() = trim().splitToSequence(' ').filter { it.isNotEmpty() }.toList()

我非常喜欢它,因为你是用 Kotlin 的方式来实现的。 - J.K

3

比你想象中的更容易:

fun stringToWords(mnemonic: String) = mnemonic.replace("\\s+".toRegex(), " ").trim().split(" ")

移除多个空格,去除开头和结尾的空格,并分割字符串。
就像一个扩展:

fun String.toWords() = replace("\\s+".toRegex(), " ").trim().split(" ")

在Roland的建议之后:
fun String.toWords() = trim().split("\\s+".toRegex())

3
你可以这样做...只需创建一个返回类型为列表的函数。
 val s = "This is a sample sentence."

 val words:Array<String>  = s.split("\\s+".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
    for (i in words.indices) {
        // You may want to check for a non-word character before blindly
        // performing a replacement
        // It may also be necessary to adjust the character class
        words[i] = words[i].replace("[^\\w]".toRegex(), "")
    }

希望这能对您有所帮助 :-)


1

您不需要作用域、冗余的"".toRegex()和最后一个表达式。您可以像这样做:

private fun stringToWords(mnemonic: String): List<String> {
    val words = ArrayList<String>()
    for (w in mnemonic.trim(' ').split(" ")) {
        if (w.isNotEmpty()) {
            words.add(w)
        }
    }
    return words
}

此外,如果您在该项目中经常使用此方法,则可以将其作为字符串类的扩展。将此方法粘贴到单独的文件中(位于类之外或添加到无类.kt文件中),以便全局访问。 然后,您可以在项目中的任何字符串上使用myString.toWords()。 该方法将如下所示。
inline fun String.toWords(): List<String> {
    val words = ArrayList<String>()
    for (w in this.trim(' ').split(" ")) {
        if (w.isNotEmpty()) {
            words.add(w)
        }
    }
    return words
}

是的,我听说过扩展。非常好的回答。 - J.K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接