Kotlin:计算字符串在字符串中出现的次数

3
val string = "5 kg rice 2 kg wheat 3 kg Soya"

在上述字符串中,有没有任何高阶函数可以计算字符串“kg”的数量?
4个回答

8
最简单的方式是:
val count = s.split("kg").size - 1

在使用 split 扩展函数将字符串分割后,减1的大小即为出现次数。

您可以在 Kotlin Playground 上测试此解决方案: https://pl.kotl.in/y6Sciwgzk


3
太棒了!简洁明了,正是我所需要的。真的很喜欢你的解决方案。赞! - raddevus

6
fun main() {
    val s = "5 kg rice 2 kg wheat 3 kg Soya"
    val c = "\\bkg\\b".toRegex().findAll(s).count()
    println(c)
}


4

标准库中似乎没有计算子字符串数量的函数。但是您可以轻松编写一个扩展函数,该函数使用indexOf(element, startIndex)函数:

fun main() {
    val string = "5 kg rice 2 kg wheat 3 kg Soya"
    
    println(string.count("kg"))
}

fun String.count(element: String): Int {
    var count = 0
    
    // Check if the string contains the element at all
    var lastIndex = indexOf(element, 0)
    while (lastIndex >= 0) {
        count += 1

        // Find the next occurence
        lastIndex = indexOf(element, lastIndex + 1) 
    }
    
    return count
}

3
我所做的是将字符串按照“kg”进行分割,并计算分割后的子字符串数量减一。 - ice spirit
1
啊,@冰之灵,那更酷了,你可以将它添加为回答。 - Animesh Sahu
1
split方法有些效率低下。在进行10000次迭代的短暂测试中,split方法需要大约2.5倍的时间。 - pixix4
应该使用lastIndex > -1而不是lastIndex > 0。否则,如果“element”在字符串的开头,此方法将无法工作。 - Kirill
@Krill 哦,好的,谢谢你的提示。现在应该是正确的了。 - pixix4

4

这个有效:

println("5 kg rice 2 kg wheat 3 kg Soya".windowed(2, 1).count { it == "kg" })

但如果您仅需要“kg”的出现次数,可以使用:

println("5 kg rice 2 kg wheat 3 kg Soyakg".windowed(4, 1).count { it == " kg " })

我相信这也可以行:

println("5 kg rice 2 kg wheat 3 kg Soya".splitToSequence(" kg ").count() - 1)

正如我之前所说,根据您认为有效的出现方式,您分割字符串或检查窗口化字符串的方式将有所不同。

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