2016-10-16 4 views
1

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

Вопрос: (вхождения заданного символа в строке) Написать рекурсивный метод, который находит число вхождений заданного символа в строке, используя следующий заголовок:

public static int count(String str, char a) 

Например: count("Welcome", 'e') возвращается 2. Напишите тестовую программу, которая предложит пользователю ввести строку, за которой следует символ, и отобразит количество вхождений символа в строке.

Проблема с моим кодом:

Исключение в потоке "основной" java.lang.StringIndexOutOfBoundsException: индекс строки из диапазона: -1

Мой код:

import java.util.Scanner; 
public class Exercise18_10{ 
    public static void main(String[] args){ 
     Scanner input = new Scanner(System.in); 
     System.out.println("Please enter a string"); 
     String str = input.next(); 
     System.out.println("Please enter a character"); 
     char car = input.next().charAt(0); 
     int x = count ("welcome", 'e'); 
     System.out.println("The number of character " +car + " in string " +str + "  = "+ x); 
    }//main 

    public static int count(String str, char a){ 
     int ct = 0;  
     if(str.length()>0) 
      if(str.charAt(0) == a) 
       ct ++; 
     count(str.substring(1),a); 
     return ct; 
    } 
} 

Помогите пожалуйста, что я делаю неправильно?

+1

Пожалуйста, научитесь форматировать свой код. – nhouser9

+0

Одна из проблем заключается в том, что вы выбрасываете результат своего рекурсивного вызова 'count', а не добавляете его в' ct'. –

+1

Я настоятельно рекомендую вам привыкнуть ** ВСЕГДА ** используя символы '{' и '}' для ветки или цикла. Если вы помещаете символы '' '' '' '' '' '' в соответствующие места в вашем коде здесь, я считаю, что вы сразу увидите, в чем проблема. –

ответ

0

Я думаю, что ошибка индекса вне диапазона должна быть из-за count(str.substring(1),a);, когда вы достигаете случая, когда ваша строка содержит только одну букву, и вы пытаетесь получить строку, оставшуюся без нее, а это нет.

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

+0

Огромное спасибо – qad

0

Что касается ошибок, то, что происходит, когда вы непрерывно substring(1)? В конце концов вы получите пустую строку, которую вы не можете подстроить! Ваш if str.length() > 0 не препятствует вызову substring.

Другая проблема: переменная ct сбрасывается на 0 каждый раз, когда вы вызываете метод, потому что он локально привязан к методу.

Вы мог сделать ct статические переменным, но так, как я хотел бы подойти к решению проблемы - реализовать другой метод для поддержания ct переменного параметра.

private static int countHelper(String str, char a, int count){ 
    if (str == null || str.length() <= 0) return count; // End recursion 

    if(str.charAt(0) == a) 
     count++; // Increment count 

    // No need for an else statement, recurse with substring 
    return countHelper(str.substring(1), a, count); 
} 

Затем, ваш фактический метод просто делегирует другой

public static int count(String str, char a) { 
    return countHelper(str, a, 0); 
} 
+0

Большое спасибо – qad

+0

Вы можете выразить свою благодарность, приняв ответ. http://stackoverflow.com/help/someone-answers –

0

Вам нужно написать count(str.substring(1), a) в if{...}. Другая серьезная проблема в вашем коде заключается в том, что count не может быть сохранен в rescurve, вы должны сделать статический код count или изменить свой код, как показано ниже.

public static int count(String str, char a) { 
    int ct = 0; 
    if (str.length() > 0) { 
     if (str.charAt(0) == a) 
      ct++; 
     ct += count(str.substring(1), a); 
    } 
    return ct; 
} 
+0

Спасибо за помощь – qad

1

Другие ответы верны; вам нужно проверить длину строки перед вызовом str.substring(1). Однако вам не нужен другой метод для поддержания переменной ct.Вот Java 101 правильный ответ:

import java.util.Scanner; 

public class Exercise18_10 { 

    public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    System.out.print("Please enter a word: "); 
    String word = input.next(); 
    System.out.print("Please enter a character: "); 
    char c = input.next().charAt(0); 
    int count = count(word, c); 
    System.out.println(String.format("%d occurrences of %c in '%s'", count, c, word)); 
    } 

    public static int count(String str, char a) { 
    if (str.length() == 0) { 
     return 0; 
    } 
    int count = 0; 
    if (str.charAt(0) == a) { 
     count++; 
    } 
    return count + count(str.substring(1), a); 
    } 


} 
+0

Большое вам спасибо – qad

+0

Ваш прием. Вы можете пометить ответ как принятый, нажав галочку. Добро пожаловать в StackOverflow и удачи в вашем классе. –

0
public static int count(String str, char a) { 
    int ct = 0;  
    if (str.length() > 0) { 
     if (str.charAt(0) == a) { 
      ct++; 
     } 
     return ct + count(str.substring(1), a); 
    } 
    return ct; 
} 

С рекурсивными функциями, всегда выяснить условие завершения и выход из функции оттуда, со значением по умолчанию, если это применимо. В этом случае верните счетчик 0, если длина строки равна 0. Повторите вызов своей функции в другом случае (где длина строки больше 0).

Кроме того, вам нужно будет вернуть значение функции и счетчика в виде суммы, чтобы получить окончательное общее количество отсчетов до первого вызова вашей функции.

+0

Большое спасибо – qad

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