2017-05-20 5 views
0

変数maxrepsが私のmainメソッドのスコープにないことを知っていますので、オブジェクトを作成して呼び出す必要がありましたが、それでもmaxrepsを取得することはできません。 どうすればこの問題を解決できますか?別のメソッドで変数を呼び出すにはどうすればいいですか?

public class LUIS{ 
    public void james(){ 
     int current=1; 
     int maxreps=1; 

     String adriana = "aabbddddnsspkrrgg"; 
     for(int a=0; a<adriana.length(); a++){ 
      if(adriana.charAt(a) == adriana.charAt(a+1)){ 
       current++; 
       if(maxreps>=current){ 
        maxreps=current; 
       } 
      } 
     } 
    } 
     public static void main(String[] args){ 
     LUIS fritz = new LUIS(); 
     final int drei = fritz.james; 

     System.out.println(maxreps); 
    } 
} 
+0

宣言 "int型maxreps = 1" は、ジェームズ()メソッドの前にそれを置きます。 – saopayne

+0

しかし、私は、主なメソッドは非静的変数を使用できないというエラーを受け取ります。 – LuisIsLuis

+0

「別のメソッドで変数を呼び出す方法は?」その理由は、そのスコープが宣言されたコードブロック(メソッド)に限定されているためです。すべてのメソッドで使用できる変数が必要な場合は、クラスフィールドにします。しかし、あなたは価値があるのではなく、変わりたいと思っていますか?それが値であれば、あなたのメソッドがそれを返すようにしたいでしょう。 – Pshemo

答えて

2

注意したように、スコープを指定すると、別のスコープで定義された変数が表示されなくなります。あなたは

public int james(){ // <-- change from void to an int return 
    int current=1; 
    int maxreps=1; 

    String adriana = "aabbddddnsspkrrgg"; 
    for(int a=0; a<adriana.length(); a++){ 
     if(adriana.charAt(a) == adriana.charAt(a+1)){ 
      current++; 
      if(maxreps>=current){ 
       maxreps=current; 
      } 
     } 
    } 

    return maxreps; // <-- return the value 
} 

値を返すことによって、あなたの特定の問題を解決し、その後mainメソッドで返された値に変数を設定することができます。

また、これをクラス変数として定義することもできますが、回避する理由はあります。グローバルは一般的に悪いです。

+0

まだ動作しません。 – LuisIsLuis

+0

@ LuisIsLuis「動作しない」とは、プログラムが期待どおりの出力を得られないことを意味します。うまくいきません。しかし、あなたのループチェックは間違っています( 'adriana.length'を実行すると' 'できません。配列オーバフローのためcharAt(a + 1) ')。更新されたメソッドと変数名を使って新しい質問を投げかけなければなりません。この*具体的な質問は変数スコープに関するものです。 – KevinO

2

1)final int drei = fritz.james;はコンパイルできません。この方法でメソッドを呼び出すことはできません(()なし)。

2)さらに、james()メソッドは、より意味のある名前を持つ必要があります。
このメソッドは、同じ文字の最大系列を計算します。だから、あなたはそれをcomputeMaxSeries()

と呼ぶことができました3)そして、代わりにvoidメソッドで、あなたは最大のシリーズ番号を返すことができました。 StringIndexOutOfBoundsExceptionadriana.charAt(a + 1)として文字列長さの有効な限界を超えてインデックスを参照

for (int a = 0; a < adriana.length(); a++) { 
     if (adriana.charAt(a) == adriana.charAt(a + 1)) { 

がスローされます:この他

4)。むしろ

if(maxreps>=current){ 
    maxreps=current; 
} 

あなたはする必要があります
最後のインデックス-1まであなたは、むしろ反復する必要がありますあなたがmaxreps代わりのcurrentに依存することによってmaxrepsを更新するので

for (int a = 0; a < adriana.length()-1; a++) { 

5)最後に、これは一貫性がありません書き込み:

if (current >= maxreps) { 
    maxreps = current; 
} 

最後に、この方法は次のようになります。

public int computeMaxSeries(){ 
    int current=1; 
    int maxreps=1; 

    String adriana = "aabbddddnsspkrrgg"; 
    for(int a=0; a<adriana.length()-1; a++){ 
     if(adriana.charAt(a) == adriana.charAt(a+1)){ 
      current++; 
      if (current >= maxreps) { 
       maxreps = current; 
      } 
     } 
    } 
    return maxreps; 
} 

今、あなたが行うことができます:クラス変数として

final int maxreps = fritz.computeMaxSeries(); 
    System.out.println(maxreps); 
+0

' public int computeMaxSeries(){ int current = 1; int maxreps = 1; 文字列adriana = "abbc"; for(int a = 0; a = current){ maxreps = current; } } } return maxreps; } public static void main(String [] args){ LUIS dr = new LUIS(); final int maxreps = dr.computeMaxSeries(); System.out.println(maxreps); } } ' – LuisIsLuis

+0

私は今コンパイルできますが、まだ動作しません。 – LuisIsLuis

+0

残りのすべての問題に対処するように更新しました。 – davidxxx

関連する問題