2

次のコードは、文字列を指定して、文字列内の小文字の 'x' 文字の数を再帰的に (ループなしで) 計算しようとしています。

コードに次のエラーがあります: Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0

このコードの主な方法は次のとおりです。

public static void main(String [] args)
{
  System.out.println(countX("hx1x"));
}

実際のコードは次のとおりです。

public static int countX(String str)
{ 
    if(str.charAt(0) != 'x')
    {
        if(str.indexOf('x') >= 1)
        {
            return countX(str.substring(1, str.length()));
        }
        else
        {
            return 0;
        }
    }
    else
    {
        return 1 + countX(str.substring(1, str.length()));
    }
}
4

4 に答える 4

1

追加するだけ

    if (str.length() <= 0) return 0;

countXの開始時(...)

例外はでスローされます

    if(str.charAt(0) != 'x')

strが""の場合

ところで。文字チェックごとに新しい文字列を作成する場合、コードは正確には効果的ではありません。また、このような再帰関数は、十分な長さの入力でStackOverflowErrorをスローします。

これを見てください: Java:文字列内のcharの出現回数をカウントするにはどうすればよいですか?

于 2011-10-22T18:08:36.390 に答える
0

簡単なことができるのに、なぜそんなに複雑にするのですか?これがあなたの問題に対するはるかに簡単な解決策です:

    int count=0;
    for(int i = 0; i< str.length(); i++){
        if(str.charAt(i) == 'x') count++;
    }
于 2011-10-22T22:31:33.247 に答える
0

再帰の基本ケースが欠落しています-文字列の長さがゼロの場合はどうなりますか?これを試して:

public static int countX(String str) {
    if (str.length() == 0)
        return 0;
    else if (str.charAt(0) == 'x')
        return 1 + countX(str.substring(1));
    else
        return countX(str.substring(1));
}

または、部分文字列操作を省略して、現在使用しているインデックスを渡すこともできます。この方法では、不要な文字列オブジェクトの作成が回避されるため、より効率的です。

public static int countX(String str, int idx) {
    if (idx == str.length())
        return 0;
    else if (str.charAt(idx) == 'x')
        return 1 + countX(str, idx+1);
    else
        return countX(str, idx+1);
}

次に、次のようにメソッドを呼び出します。

countX("hx1x", 0)
于 2011-10-22T18:10:16.563 に答える