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
  • 我自己,我会使用String#split(...)方法,只需几行代码就可以解决这个问题。
  • 但是如果你必须这样做,不要for循环或循环 charCount 次数,因为 charCount 是字符串的大小,你当然不想循环这么多次。这没有任何意义。相反,您想要循环空格数,而不是字符数,这让我想到了下一个建议:
  • 使用while循环,而不是for循环和循环,直到indexOf(...)方法返回 -1。换句话说,让 Java 努力找出 String 何时用完空格,而不是你猜的。
于 2012-09-27T22:13:41.983 回答
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 回答