0

プログラムは、2つの文字列の文字を交換して取得した文字列を返します。つまり、string s1 = "aceg" string s2 = "hfdb"結果は"abcdefgh"になります(2つの文字列の長さは常に同じです。

まあ、私はこのように進めました:

public class Eserc2 {

    public static String ricorsiveString(String s1, String s2) {

        if(s1.length() == 0 && s2.length() == 0) {
            return "";
        } else {

            char c = s1.charAt(0);
            char b = s2.charAt(s2.length()-1);

            String s = String.valueOf(c) ;
            String t = String.valueOf(b) ;
            String tot = s+t ;

            return tot + ricorsiveString(s1.substring(1),s2.substring(s2.length()));
        }
    }

    public static void main(String[] args) {

        String a = "aceg";
        String b = "bdfh";
        ricorsiveString(a,b);

    }
}

問題は、私がコンパイルするときにpcが例外を見つけることです:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.charAt(String.java:658)
    at eserc2.Eserc2.ricorsiveString(Eserc2.java:20)
    at eserc2.Eserc2.ricorsiveString(Eserc2.java:26)
    at eserc2.Eserc2.main(Eserc2.java:34)

手伝ってくれませんか?

4

4 に答える 4

1
 if(s1.length() == 0 && s2.length() == 0) {

する必要があります

 if(s1.length() == 0 || s2.length() == 0) {
于 2013-02-22T18:03:57.493 に答える
1

問題は、s2が空であるがそうでない場合ですs1:

if(s1.length() == 0 && s2.length() == 0)

false (s1は空ではない) になりますが、次の行:

s1.length() == 0 && s2.length() == 0

-1 の位置にある文字にアクセスしようとします。

注: プログラムを段階的にデバッグしていれば、質問を入力するよりも短い時間で問題を発見できたはずです!

于 2013-02-22T18:04:23.437 に答える
1

この行はあなたが望むことをしていません (s2.substring(s2.length()) 呼び出しは常に長さ 0 の文字列を返します)

return tot + ricorsiveString(s1.substring(1),s2.substring(s2.length()))

に置き換える必要があります

return tot + ricorsiveString(s1.substring(1),s2.substring(0, s2.length() - 1));

設計上の選択として、渡された文字列が同じ長さでなければならないという前提条件に一致することもテストする必要があります。または、&& テストを || に変更します。(他の人が示唆しているように)異なる長さの文字列でコードが機能するようにします。

于 2013-02-22T18:09:18.253 に答える
0

あなたが述べた条件は正しくありません:

if(s1.length() == 0 || s2.length() == 0) {

変数の長さのいずれかがゼロの場合、コードは実行されないためです。

于 2013-02-22T18:08:27.380 に答える