9

私はJavaを学んでいて、文字列を逆方向に出力する再帰関数を作成するセルフテストの演習に固執しています...

コンパイラエラーは理解できましたが、どうしたらよいかわかりません。

私のコード...

class Back {
    void Backwards(String s) {
            if (s.length = 0) { 
                    System.out.println();
                    return;
            }
            System.out.print(s.charAt(s.length));
            s = s.substring(0, s.length-1);
            Backwards(s);
    }
}

class RTest {
    public static void main(String args[]) {
            Back b;
            b.Backwards("A STRING");
    }

}

コンパイラ出力...

john@fekete:~/javadev$ javac Recur.java 
Recur.java:3: error: cannot find symbol
    if (s.length = 0) { 
         ^
  symbol:   variable length
  location: variable s of type String
Recur.java:7: error: cannot find symbol
    System.out.print(s.charAt(s.length));
                               ^
  symbol:   variable length
  location: variable s of type String
Recur.java:8: error: cannot find symbol
    s = s.substring(0, s.length-1);
                        ^
  symbol:   variable length
  location: variable s of type String
3 errors

完成したコード...

class Back {
    static void backwards(String s) {
            if (s.length() == 0) {
                    System.out.println();
                    return;
            }
            System.out.print(s.charAt(s.length()-1));
            s = s.substring(0, s.length()-1);
            backwards(s);
    }
}

class RTest {
    public static void main(String args[]) {

            Back.backwards("A STRING");
    }
}   
4

7 に答える 7

8

このように書いてください:

s.length() == 0 // it's a method, not an attribute
于 2012-10-28T18:29:33.370 に答える
2

いくつかの一般的な「優れたコーディング」の提案:

  • クラス名は「もの」を表す必要があります。通常、クラス名は名詞です(例:「StringTool」)。
  • メソッドはアクションを表す必要があります。通常、メソッド名は動詞です(例:「reverse」)。
  • パラメータ名と変数名は意味があり、それらが何を表すかを説明する必要があります。
  • 誤解を招く可能性があるため、メソッドパラメータを再割り当てしないでください。
  • メソッドには、正確に1つの責任が必要です(したがって、文字列を逆にして印刷しないでください)。これにより、明快さと再利用が促進されます。

これらの提案を完成したコードに適用しました。以下を参照してください。

public class StringTool {

    public static String reverse(String source) {

        // stop condition of the recursion
        if (source.isEmpty()) {
            return "";
        }

        int lastPosition = source.length() - 1;
        String lastCharacter = source.charAt(lastPosition);
        String restOfSource = source.substring(0, lastPosition);

        // place the last character at the beginning and reverse the rest 
        // of the source recursively
        return lastCharacter + reverse(restOfSource);
    }

    // test method
    public static void main(String args[]) {
        System.out.println(reverse("A STRING"));
    }

} 
于 2012-10-28T19:49:58.923 に答える
1

ifステートメントでは、チェックするのではなく、s.lengthに0を割り当てています。このようにしてください:

if(s.length()==0)
//rest of your code

もう1つの障害はs.charAt(s.length())です。文字列のi番目の文字のインデックスは、配列のインデックスと同様に(i-1)です。したがって、文字列の最後の文字にはインデックスがあります(s.length()-1)。したがって、そのコード行を。に置き換えますs.charAt(s.length()-1)

于 2012-10-28T18:33:06.050 に答える
1

これは、達成しようとしていることをよりよく反映しているはずです。

class Back {
    void Backwards(String s) {
            if (s.length() == 0) { 
                    System.out.println();
                    return;
            }
            System.out.print(s.charAt(s.length()));
            s = s.substring(0, s.length()-1);
            Backwards(s);
    }
}

public class RTest {
    public static void main(String args[]) {
            Back b = new Back();
            b.Backwards("RAPE APE");
    }
}
  • length()は関数です
  • 比較用途==
  • 使用するにはbをインスタンス化する必要があります
于 2012-10-28T18:34:28.340 に答える
0

You forgot the parentheses:

s.length()
于 2012-10-28T18:29:41.580 に答える
0

-フィールドではなく、という名前関数Stringが提供されます。length()length

-を使用している場合ArraylengthArrayには。という名前のインスタンス変数が1つしかないためlengthです。

例えば:

s.length() == 0;
于 2012-10-28T18:42:40.340 に答える
0

lengthメソッドであり、属性ではありません。そのように使用する必要があります。

s.length(); // note the use of parens

また、次の条件により、修正後にコンパイルエラーが発生します。

if (s.length = 0) { 

そのはず

if (s.length == 0) { 

そして最後に、あなたのmainメソッドでは、b変数をインスタンス化する必要があります。

Back b = new Back();
于 2012-10-28T18:30:22.050 に答える