我有两个字符串
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
您可以使用的一些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 }
每个字符单独出现
带forEach
和MutableMap
:
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 页面中浏览更多String
扩展函数
您可以使用以下高阶方法,
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)
}
如何解决任务:恕我直言,执行此任务的最佳方法是使用 filter
或 count
而不是正则表达式,因为您不必使用任何特殊语法。
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'