Kotlin:计算`String`中`charArray`的出现次数`
我有两条线Kotlin:计算`String`中`charArray`的出现次数`,string,kotlin,String,Kotlin,我有两条线 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.findA
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)
可以使用第一个字符串中的字符作为映射键,例如:
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 string1=“你好”
val string2=“你好,世界”
val chars=HashMap()
for(string1中的字符)//填充键
字符[char]=0
for(string2中的字符)//计数出现次数
字符[字符]?。让我们{
chars[char]=it+1
}
以下是一些可以使用的扩展函数
任何字符的出现
使用扩展功能:
val string1 = "Hello"
val string2 = "Hello world Hello"
print(
string2.fold(0) {
sum: Int, c: Char ->
if (string1.contains(c))
sum + 1
else
sum
}
)
string2.windowed(string1.length){
if (it.equals(string1))
1
else
0
}.sum()
甚至更短,包括:
最短的:
string2.count{ string1.contains(it) }
每个字符分别出现的次数
带和a:
您可以在中浏览更多的
字符串
扩展函数来回答实际问题:最简单的正则表达式模式是使用字符类语法“[“+string1+”]”
。注意,这并不总是表现得很好。它适用于所有ASCii字母和数字。特殊字符,如\^-代码>必须正确转义。有关规则,请参见
只需使用Kotlin的收集功能即可
val occurrences = string2.filter{ it in string1}
.groupingBy { it }
.eachCount()
当您只想计算单个字符的出现次数时的简化用例:
println(“大海捞针”。计数{c->c=='a'})
//产出:3
参考:
您不需要任何正则表达式来计算字符串中的字符数。只需使用循环(或任何其他类型的迭代)就可以了。您可以添加您期望的逻辑吗?您需要单独计算每个字符吗?例如,有多少次使用“H”,多少次使用“E”等等?下面是一个使用Kotlin的收集函数的单行解决方案:val引用=string2.filter{it in string1}.groupingBy{it}.eachCount()返回值不应该是sum+1
和sum
!忘了他们。我将为每个字符添加一个映射变量,以便在搜索整个字符串时更好地使用windowed!我稍微喜欢这样做:string2.windowed(string1.length).filter{it==string1}.count()
这应该是公认的答案,谢谢你介绍我使用windowed,我是Kotlin/FP的新手。
string2.windowed(string1.length){
if (it.equals(string1))
1
else
0
}.sum()
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)
}
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 occurrences = string2.filter{ it in string1}
.groupingBy { it }
.eachCount()