我有两个琴弦
val string1 = "Hello"
val string2 = "Hello world"
Run Code Online (Sandbox Code Playgroud)
我必须从统计每个字母的存在,string1在string2中Kotlin
到目前为止,我已经编写了这么多代码,并使用了正则表达式
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模式应该是什么?在科特林有更好的方法吗
您可以使用以下高阶方法,
val count = string2.count{ string1.contains(it) }
print(count)
Run Code Online (Sandbox Code Playgroud)
这是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)
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)
您可以String在stblib页面中浏览更多扩展功能String
只需使用Kotlin的收集功能
val occurrences = string2.filter{ it in string1}
.groupingBy { it }
.eachCount()
Run Code Online (Sandbox Code Playgroud)
当您只想计算单个字符的出现次数时的简化用例:
println("needle in a haystack".count{ c -> c == 'a' })
// OUTPUT: 3
Run Code Online (Sandbox Code Playgroud)
参考: