超出单词计数的界限错误

时间:2014-01-25 21:39:36

标签: java

我正在尝试编写自己的Java字数统计程序。我知道可能已经有了一种方法,但我想让它发挥作用。我在第14行遇到了一个越​​界错误。我尝试使用输入字来计算它在输入字符串中出现的次数。所以我要循环到stringlength - wordlength,但这就是问题所在。

以下是代码:

import java.util.Scanner;

public class wordcount {

  public static void main(String[] args)
  { 
    Scanner s = new Scanner(System.in);
    System.out.print( "Enter word : "  );
    String word = s.nextLine();
    Scanner t = new Scanner(System.in);
    System.out.print("Enter string: ");
    String string = t.nextLine();
    int count = 0;
    for (int i = 0; i < string.length()-word.length(); i = i+1){
      String substring = string.substring(i,i+word.length());
      if (match(substring, word)==true){
        count += 1;
      }
    }

    System.out.println("There are "+count+ " repetitions of the word "+word);

  }

  public static boolean match(String string1, String string2){
      for (int i=0; i<string1.length(); i+=1){
          if (string1.charAt(i)!=string2.charAt(i)){
            return false;
          }             
      }
      return true;
  }
}

2 个答案:

答案 0 :(得分:0)

我没有收到越界错误,你能告诉我你用于单词和字符串的值是什么吗?

我发现了您的程序存在错误。如果word等于string,它仍会返回count 0.我建议再添加一次迭代并使用regionMatches。 RegionMatches使你的匹配方法过时,如果word.length()+ i等于或大于string.length(),则返回false,避免超出边界问题。

正如您所看到的,我还将计算移到了一个单独的方法,这将使您的代码更具可读性和可测试性。

正如克里斯蒂安指出的那样;你确实只需要一个Scanner对象。我已经调整了以下代码来反映它。

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.print("Enter word : ");
    String word = sc.nextLine();
    System.out.print("Enter string: ");
    String string = sc.nextLine();
    int count = calculateWordCount(word, string);
    System.out.println("There are " + count + " repetitions of the word " + word);
}

private static int calculateWordCount(String word, String string) {
    int count = 0;
    for (int i = 0; i < string.length() - word.length() + 1; i++) {
        if (word.regionMatches(0, string, i, word.length())) {
            count++;
        }
    }
    return count;
}

答案 1 :(得分:0)

首先,不需要两个Scanner,您可以使用相同的Scanner对象执行许多输入。

此外,此if条件

if (match(substring, word) == true)

可以像

一样重写
if (math(substring, word))

我还建议您使用i++来增加循环变量。不是绝对必要的,但“几乎”是一种惯例。你可以read more about that here

现在,关于IndexOutOfBoundsException,我已经测试了代码,但我没有找到任何输入样本来获取它。

此外,还有一个问题,您在for

中缺少一次迭代
for (int i = 0; i < string.length() - word.length() + 1; i++) { // Add  '+ 1'
    String substring = string.substring(i, i + word.length());
    // System.out.println(substring);
    if (match(substring, word)) {
        count++;
    }
}

您可以通过在循环中放置 print 语句来测试它,以打印每个子字符串。