Kotlin计算字符串

时间:2018-04-15 20:08:15

标签: string kotlin

我有两个字符串

val string1 = "Hello"
val string2 = "Hello world"

我必须计算string1string2 Kotlinval string1_array = string1.toCharArray() val pattern = Regex("") // Regex pattern here val matcher = string2 val count = pattern.findAll(matcher).count() 的每个字母的存在情况

到目前为止,我已经编写了这么多代码并坚持使用正则表达式

strchr()

搜索charArray的相应正则表达式应该是什么?在Kotlin有更好的方法吗

6 个答案:

答案 0 :(得分:4)

只需使用Kotlin的收藏功能

val occurrences = string2.filter{ it in string1}
                        .groupingBy { it }
                        .eachCount()

答案 1 :(得分:3)

以下是您可以使用的一些String扩展功能

任何char

的出现

使用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) }

单独出现每个字符

使用forEachMutableMap

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 page

中浏览更多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执行此任务的最佳方法是使用filtercount而不是正则表达式,因为您不必使用使用任何特殊语法。

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