5

単語数を数える必要がありますが、正しい方法は、文字列内の前の文字が文字 (つまり、他の文字) ではない回数を計算することであると想定しています。文字列内のコロン、スペース、タブ、およびその他の記号。最初の私の考えは、各文字をループして、アルファベットの文字が得られない回数を数えることでした

    for(int i = 0; i < string.length(); i++) {
      for(int j = 0; i < alphabets.length(); j++) {
       if (string.charAt(i-1) == alphabets.charAt(j)) {
           counter++;
       }
     }
   }

ただし、このため、常に範囲外の配列を取得します。だから、私は少し助けが必要か、実際により効率的な別の方法が必要です。Matches を [a-zA-z] のみに使用することを考えましたが、発生回数をカウントする際に char を文字列に匹敵するように処理する方法がわかりません。

ありがとうございました

4

8 に答える 8

3

String.split()を使用して、各要素に 1 つの単語を含む文字列を配列に変換できます。単語数は、配列の長さによって与えられます。

int words = myString.split("\s+").length;
于 2012-05-20T04:17:23.417 に答える
2

「[A-Za-z]」のような正規表現を使用するというあなたの提案はうまくいくでしょう。分割コマンドでは、次のように逆に分割します。

String [] words = "テスト例:1、2、3" .split( "[^ A-Za-z] +");

編集:あなたが生の速度を探しているだけなら、これは仕事をより速くするでしょう。

public static int countWords(String str) {
    char[] sentence = str.toCharArray();
    boolean inWord = false;
    int wordCt = 0;
    for (char c : sentence) {
        if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') {
            if (!inWord) {
                wordCt++;
                inWord = true;
            }
        } else {
            inWord = false;
        }
    }
    return wordCt;
}
于 2012-05-20T04:40:12.837 に答える
2

この問題は、アルゴリズムが許容するよりも少し複雑です。

  • 2 つ以上のスペースが連続している場合はどうなりますか?
  • 文字列が空白 (または単語以外の文字) で開始または終了する場合はどうなりますか?

これは宿題のように見えるので、コードを提供したくありません。考えやすい代替アプローチを提案します。

  • 文字列内の文字を 1 つずつ見ていきます。
  • 現在単語をスキャンしている場合、または現在単語をスキャンしていない場合は、覚えておくべきことがあります。
  • 単語を入力または残すタイミングを決定するために何かを行い、それに応じてカウンターを増やします。
于 2012-05-20T04:30:14.167 に答える
1

を取得している理由IndexOutOfBoundsExceptionは、おそらく i が 0 の場合string.charAt(i-1)、0-1 が -1 であるため、内部ループで例外がスローされるためです。より効率的な手法を使用できますが、メソッドが機能する可能性があることを修正した場合。

于 2012-05-20T04:22:04.887 に答える
1

コードを直接扱うと、最初のループはiの最初の値としてi =0 になりますが、次に

string.charAt(i-1) = string.charAt(-1),

これは、範囲外の配列の由来です。

2 番目のループには別の問題があります。

for(int j = 0; i < alphabets.length(); j++) {

アポストロフィも単語の一部と見なすこともできます。

于 2012-05-20T04:27:23.300 に答える
0
   if (string.charAt(i-1) == alphabets.charAt(j)) {
       counter++;
   }

文字がアルファベット文字の場合、カウンターをインクリメントしています。アルファベット文字でない場合は、インクリメントする必要があります。

于 2012-05-20T04:21:43.353 に答える