0

次の文字列が与えられます:

String text = "森は\n素敵で、\ t\t暗くて深いです。";

すべての空白を単一の文字として扱いたい。たとえば、\nは1文字です。また\t\t、1文字である必要があります。その論理で、私は36文字と7語を数えます。しかし、これを次のコードで実行すると、次のようになります。

String text = "The woods are\nlovely,\t\tdark and deep.";

int numNewCharacters = 0;
for(int i=0; i < text.length(); i++)
    if(!Character.isWhitespace(text.charAt(i)))
        numNewCharacters++;

int numNewWords = text.split("\\s").length;

// Prints "30"
System.out.println("Chars:" + numNewCharacters);

// Prints "8"
System.out.println("Words:" + numNewWords);

30文字と8語あると言っています。理由について何かアイデアはありますか?前もって感謝します。

4

4 に答える 4

5

個々の空白を照合しています。代わりに、 1つ以上で一致させることができます:

text.split("\\s+")
于 2013-03-03T23:11:21.650 に答える
0

最初のループでは空白以外の文字のみをカウントしているため、スペースなどはまったくカウントしていません。それなら30が正解です。2番目については-splitは連続する空白を別個のものとして扱っているのではないかと思うので、2つのタブの間に「null」という単語があります。

于 2013-03-03T23:16:44.130 に答える
0

Reimueusはすでにあなたの単語数の問題を解決しています:

text.split("\\s+")

そして、あなたのキャラクター数はコレットです。改行\nとタブ\tは空白と見なされます。それらを望まない場合は、独自のisWhitespace関数を実装できます。

于 2013-03-03T23:17:25.130 に答える
0

単語と文字を数える完全なソリューションは次のとおりです。

    System.out.println("Characters: " + text.replaceAll("\\s+", " ").length());
    Matcher m = Pattern.compile("[^\\s]+", Pattern.MULTILINE).matcher(text);
    int wordCount = 0;
    while (m.find()) {
        wordCount ++;
    }
    System.out.println("Words: "+ wordCount);       

文字数は、すべての空白グループを 1 つのスペースに置き換え、結果の文字列の長さだけを取得することによって達成されます。

単語数については、空白を含まない任意の文字グループに一致するパターンを作成します。ここで\\w+パターンを使用できますが、一致するのは英数字とアンダースコアのみです。Pattern.MULTILINEパラメータにも注意してください。

于 2013-03-03T23:45:11.460 に答える