web-dev-qa-db-ja.com

Kotlin: `String`内の` charArray`の出現回数をカウント

弦が2本ある

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

Kotlinstring1string2からの各文字の存在を数える必要があります

これまでのところ、私はこれだけのコードを書いて、正規表現にこだわっています

val string1_array = string1.toCharArray()
val pattern = Regex("") // Regex pattern here
val matcher = string2

val count = pattern.findAll(matcher).count()

CharArrayを検索するための適切な正規表現パターンは何ですか?コトリンで行うより良い方法はありますか

5
Anuj TBE

以下の高次の方法を使用できます。

val count = string2.count{ string1.contains(it) }
print(count)

7を印刷します

1
Kamran

最初の文字列の文字をマップキーとして使用できます。次に例を示します。

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
    }
0
Miha_x64

実際の質問に答えるには:最も単純な正規表現パターンは、文字クラス構文"[" + 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)
}
0
leonardkraemer