我有两个字符串
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()
的每个字母的存在情况
到目前为止,我已经编写了这么多代码并坚持使用正则表达式
strchr()
搜索charArray的相应正则表达式应该是什么?在Kotlin有更好的方法吗
答案 0 :(得分:4)
只需使用Kotlin的收藏功能
val occurrences = string2.filter{ it in string1}
.groupingBy { it }
.eachCount()
答案 1 :(得分:3)
以下是您可以使用的一些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) }
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
个扩展功能
答案 2 :(得分:2)
仅用于计算单个字符的出现次数时的简化用例:
println("needle in a haystack".count{ c -> c == 'a' })
// OUTPUT: 3
参考:
答案 3 :(得分:0)
您可以使用以下代码段
val string1 = "hello"
val string2 = "hello world"
val s1Char = string1.toCharArray().distinct()
val s2Char = string2.toCharArray()
var count: Int = 0
for ( c : Char in s1Char) {
count += s2Char.filter { s -> s == c }.count()
}
print("Count = $count")
它将打印7
答案 4 :(得分:0)
您可以使用第一个字符串中的字符作为映射键,例如:
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
}
答案 5 :(得分:0)
回答实际问题:最简单的正则表达式模式是使用字符类语法"[" + 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)
}
如何解决任务: Imho执行此任务的最佳方法是使用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)
}