0

文字列内の単語をカウントするクラスのプログラムを作成しています。入力された文字列に 3 つ以上の単語がある場合は、文を再度出力しますが、各単語はそれぞれの行に表示されます。

だから私はスペースをに置き換えようとしています\n。3 語以上の文を入力すると、次のようになります。

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
        at java.lang.String.substring(String.java:1937)
        at lab3.main(lab3.java:32)

これが私のコードです:

import java.util.Scanner;

public class lab3 {

public static void main(String [] args) {

    Scanner scan = new Scanner (System.in);

    int wordCount = 1;
    char aChar;

    System.out.println("Enter a sentence.");

    String sentence = scan.nextLine();
    int charCount = sentence.length();

    for (int i=0; i < sentence.length(); i++){
            if (sentence.charAt(i) != ' '){

                    continue;
            } else {
                    wordCount++;
                    }
            }

    System.out.println("Number of words = " + wordCount);

            if (wordCount >= 4){
            for (int i = 0; i <= charCount; i++){
                    int space = sentence.indexOf(" ");
                    int endSpace = space + 1;
                    sentence = sentence.substring(0, space) 
                            + "\n"
                            + sentence.substring(endSpace, sentence.length());
                    }
                    System.out.println(sentence);

            } else {
            System.out.println(sentence);

            }

    }
}

問題は 31 行目の for ループにあるようですが、3 語を超える文を入力すると -1 が返される仕組みがわかりません。部分文字列を間違って使用していますか? どんな助けでも大歓迎です。

4

4 に答える 4

2

ここのインデックスを確認する必要がありspaceます。検索文字列が見つからない場合String.indexOf()に返されます。-1

int space = sentence.indexOf(" ");
int endSpace = space + 1;
if (space != -1) {
    sentence = sentence.substring(0, space) + "\n"
            + sentence.substring(endSpace, sentence.length());
}
于 2012-09-27T22:11:21.317 に答える
1

コードを保持したい場合は、sentence.index(" ")を実行するときに -1 が返されるかどうかを確認する必要があります。以下のようにループのブレイクアウトが返された場合。ただし、これは適切なコーディング スタイルではありません。String API の正規表現またはその他のより単純なメソッドを使用したいと思います。

 if (wordCount >= 4){
            for (int i = 0; i <charCount-3; i++){
                    int space = sentence.indexOf(" ");
                    if(space==-1){// check if space is -1
                        break;
                    }   
                    System.out.println(i+ " " + space);
                    int endSpace = space + 1;
                    sentence = sentence.substring(0, space)
                            + "\n"
                         + sentence.substring(endSpace, sentence.length()-1);
                    }
                    System.out.println(sentence);
于 2012-09-27T22:26:17.867 に答える
0

私の解決策は、実際には単語ではない単語をチェックしません。

import java.util.Scanner;

public class SentenceWordCount {
    Scanner s = new Scanner (System.in);
    int wordCount;

    public SentenceWordCount() {
        System.out.println("Enter a sentence");

        String sentenceEntered = s.nextLine();
        String[] brokenSentence = sentenceEntered.split(" ");

        wordCount = brokenSentence.length;

        if(wordCount > 3){
        for(String s : brokenSentence){
                System.out.println(s);
            }
        }

        System.out.println("Number of words equals : " + wordCount);
    }
}

乾杯、

ジェイミー

于 2012-09-28T01:03:09.033 に答える
0
  • 私自身、String#split(...)メソッドを使用して、わずか数行のコードでこれを解決できます。
  • ただし、この方法で実行する必要がある場合は、forループまたはループ charCount を何回も実行しないでください。これは、charCount が文字列のサイズであり、これを何回もループしたくないからです。意味がありません。むしろ、文字数ではなく、スペースの数をループしたいので、次の推奨事項に進みます。
  • メソッドによって -1 が返されるまでループとループwhileではなく、ループを使用します。言い換えれば、文字列のスペースがなくなった時期を推測するのではなく、Java に難しい作業を任せてください。forindexOf(...)
于 2012-09-27T22:13:41.983 に答える