字符串中charArray的Kotlin计数出现

Anu*_*TBE 5 string kotlin

我有两个琴弦

val string1 = "Hello"
val string2 = "Hello world"
Run Code Online (Sandbox Code Playgroud)

我必须从统计每个字母的存在,string1string2Kotlin

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

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

val count = pattern.findAll(matcher).count()
Run Code Online (Sandbox Code Playgroud)

搜索charArray的合适的Regex模式应该是什么?在科特林有更好的方法吗

Kam*_*ran 9

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

val count = string2.count{ string1.contains(it) }
print(count)
Run Code Online (Sandbox Code Playgroud)


sta*_*an0 8

这是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
     }   
) 
Run Code Online (Sandbox Code Playgroud)

甚至更短sumBy

string2.sumBy { 
    if (string1.contains(it))
        1
    else
        0
}
Run Code Online (Sandbox Code Playgroud)

最短的:

string2.count{ string1.contains(it) }
Run Code Online (Sandbox Code Playgroud)

每个字符分别出现

forEachMutableMap

val charsMap = mutableMapOf<Char, Int>()

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

print(charsMap)
Run Code Online (Sandbox Code Playgroud)

整体发生 string1

具有windowed扩展功能:

string2.windowed(string1.length){
    if (it.equals(string1))
        1
    else
        0
}.sum()
Run Code Online (Sandbox Code Playgroud)

您可以Stringstblib页面中浏览更多扩展功能String

  • 搜索整个字符串时很好地使用了窗口!我稍微喜欢这样做:`string2.windowed(string1.length).filter { it == string1 }.count()` (3认同)
  • 恕我直言,这应该是公认的答案,谢谢您向我介绍了窗口式技术,我是Kotlin / FP的新手。 (2认同)

hex*_*kid 8

只需使用Kotlin的收集功能

val occurrences = string2.filter{ it in string1}
                        .groupingBy { it }
                        .eachCount()
Run Code Online (Sandbox Code Playgroud)


ccp*_*zza 5

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

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

参考: