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

huus2vyu  于 2022-11-16  发布在  Kotlin
关注(0)|答案(7)|浏览(162)

我有两根弦

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

我必须计算string1中的每个字母在Kotlin中的存在性
到目前为止,我已经编写了这么多代码,并坚持使用regex

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

val count = pattern.findAll(matcher).count()

应该使用什么样的正则表达式模式来搜索charArray?在Kotlin中是否有更好的方法

kg7wmglp

kg7wmglp1#

下面是一些可以使用的String扩展函数

任何字符的出现次数

使用fold扩展函数:

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

print(
     string2.fold(0) {
         sum: Int, c: Char ->
         if (string1.contains(c))
             sum + 1
         else
             sum
     }   
)

或者使用sumBy时更短:

string2.sumBy { 
    if (string1.contains(it))
        1
    else
        0
}

或者更短:

string2.count { string1.contains(it) }

或最短:

string2.count { it in string1 }

每个字符单独出现的次数

使用forEachMutableMap

val charsMap = mutableMapOf<Char, Int>()

string2.forEach{
    charsMap[it] = charsMap.getOrDefault(it, 0) + 1
}

print(charsMap)

整个string1的出现次数

windowed扩展函数:

string2.windowed(string1.length){
    if (it.equals(string1))
        1
    else
        0
}.sum()

您可以在String stblib page中浏览更多String扩展函数

zqdjd7g9

zqdjd7g92#

可以使用下面的高阶方法、

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

mwecs4sa3#

只要使用Kotlin的集合函数

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

h6my8fg24#

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

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

参考编号:

cygmwpex

cygmwpex5#

要回答实际问题:最简单的正则表达式模式是使用字符类语法"[" + 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)
}

**How to solve the task:**Imho完成此任务的最佳方法是使用filtercount而不是regex,因为您不必使用任何特殊语法。

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)
}
k10s72fa

k10s72fa6#

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

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
    }
xwmevbvl

xwmevbvl7#

val x = name.count({ch->ch=='z'}) //if you want to count 'z'

相关问题