2016-10-16 16 views
1

私はここでこの問題の解決策を見てきましたが、人のコードは私のものとは異なります。私はちょうど私が間違っていることを知りたい。私は非常にプログラミングには新しく、良いことが切望されています。文字列内の指定された文字の出現数を見つけるための再帰

質問:例えば

public static int count(String str, char a) 

:(文字列内の指定された文字の出現)は、以下のヘッダを使用して、文字列内の指定された文字の出現回数を見つける再帰的方法を書くcount("Welcome", 'e')戻ります2。文字列の後に文字を入力し、その文字列内の文字の出現数を表示するようにユーザーに促すテストプログラムを作成します。範囲外の文字列インデックス:-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; 
    } 
} 
私のコードで

問題:スレッド "メイン" java.lang.StringIndexOutOfBoundsExceptionで

例外

助けてください、私は間違って何をしていますか?

+1

あなたのコードをフォーマットすることを学ぶしてください。 – nhouser9

+0

一つの問題は、あなたの代わりにct' 'にそれを追加するので、count''にあなたの再帰呼び出しの結果を捨てているということです。 –

+1

私は、ブランチやループに '{'と '}'文字を使って**常に**の習慣に入ることを強くお勧めします。あなたの '{'と '} '文字をここのコード中の適切な場所に置くと、問題の内容がすぐにわかると思います。 –

答えて

0

インデックスが範囲外のエラーである必要があります。count(str.substring(1),a);の場合は、文字列に1文字しかない文字列があり、文字列がないまま残っている文字列を取得しようとした場合です。

PS:あなたがいることを修正した後、あなたはまた、ときに継続的にsubstring(1)何が起こるか、エラーについて...あなたが追加して、CT変数の値を維持しているか

+0

おかげで、あなたは答えを受け入れることによって、あなたの感謝を示すことができる – qad

0

を確認する必要がありますか?あなたは結局、あなたが部分文字列にすることができない空の文字列を得るでしょう! if str.length() > 0substringコールを防ぎません。

もう1つの問題 - ct変数は、メソッドにローカルスコープが設定されているため、メソッドを呼び出すたびに0にリセットされます。

あなたct静的変数が、私は問題にアプローチような方法を作ることができる - ct変数のパラメータを維持するための別の方法を実装します。他の1

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

あなたはそんなに – qad

+0

ありがとうございました。 http://stackoverflow.com/help/someone-answers –

0

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); 
} 

次に、あなたの実際の方法は、単に代表はあなたはif{...}count(str.substring(1), a)を記述する必要があります。 あなたのコードのもう1つの大きな問題は、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

関連する問題