2014-01-25 3 views
0

Я пытаюсь написать свою собственную программу подсчета слов 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

Кажется, что все нормально. С каким вкладом вы получаете IndexOutOfBoundsException? –

ответ

0

Прежде всего, два Scanner s не нужны, вы можете сделать много входов с тем же 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++; 
    } 
} 

Вы можете проверить это, поставив печати заявление внутри цикла, чтобы напечатать каждую подстроку.

+0

Спасибо, это исправлено. – slaga

0

Я не получаю ошибку выхода за границы, вы можете сказать мне, какие ценности вы использовали для слова и строки?

Я определил ошибку с вашей программой. Если слово равно строке, оно все равно возвращает count 0. Я предлагаю добавить еще одну итерацию и вместо этого использовать regionMatches. RegionMatches делает ваш метод соответствия устаревшим и возвращает false, если word.length() + i равно или больше, чем string.length(), избегая проблем с пределами.

Как вы можете видеть, я также перевел вычисления на отдельный метод, это сделает ваш код более читабельным и проверяемым.

И как указал христианин; вам действительно нужен только один объект сканера. Я применил приведенный ниже код, чтобы отразить его.

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; 
} 
+0

Спасибо, я узнал из этого. – slaga

Смежные вопросы