Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin:计算`String`中`charArray`的出现次数`_String_Kotlin - Fatal编程技术网

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()