Kotlin:计算“字符串”中“charArray”的出现次数



我有两个字符串

val string1 = "Hello"
val string2 = "Hello world"

我必须数string1 string2中每封信的存在Kotlin

到目前为止,我已经编写了这么多代码并坚持使用正则表达式

val string1_array = string1.toCharArray()
val pattern = Regex("") // Regex pattern here
val matcher = string2
val count = pattern.findAll(matcher).count()

搜索charArray的适当正则表达式模式应该是什么?在 Kotlin

您可以使用以下高阶方法,

val count = string2.count{ string1.contains(it) }
print(count)

只需使用 Kotlin 的集合函数

val occurrences = string2.filter{ it in string1}
                        .groupingBy { it }
                        .eachCount()

当您只想计算单个字符的出现次数时,简化了用例:

println("needle in a haystack".count{ c -> c == 'a' })
// OUTPUT: 3

参考:

  • https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/count.html

要回答实际问题:最简单的正则表达式模式是使用字符类语法"[" + string1 + "]"。当心,这并不总是表现得很好。它适用于所有ASCii字母和数字。^-?!等特殊字符必须正确转义。有关规则,请参阅 https://www.regular-expressions.info/charclass.html

fun main(args: Array<String>): Unit {
    val string1 = "Hello"
    val string2 = "Hello world Hello"
    val string1_array = string1.toCharArray()
    val pattern = Regex("[" + string1 + "]") // Regex pattern here
    val matcher = string2
    val count = pattern.findAll(matcher).count()
    print(count)
}

如何解决任务:恕我直言,执行此任务的最佳方法是使用 filtercount 而不是正则表达式,因为您不必使用任何特殊语法。

fun main(args: Array<String>): Unit {
        val string1 = "Hello"
        val string2 = "Hello world Hello"
        //returns all chars of string2 contained in string1 as list
        val count = string2.filter { string1.contains(it) }.length
        //an other a bit shorter solution with count
        count = string2.count{ string1.contains(it) }
        print(count)
}

您可以使用第一个字符串中的字符作为映射键,例如:

val string1 = "Hello"
val string2 = "Hello world"
val chars = HashMap<Character, Int>()
for (char in string1) // fill keys
    chars[char] = 0
for (char in string2) // count occurrences
    chars[char]?.let {
        chars[char] = it + 1
    }
val x = name.count({ch->ch=='z'}) //if you want to count 'z'

最新更新