2012-04-20 2 views
0

私はOOPを初めて使うので、通常はすべてのコードを単一のクラスに入れてメソッドを使用します。しかし、私は状態情報を維持し、クラスが最も適していると思っていますが、私はそれの周りに私の頭を包んで問題があります。クラスを使用して状態を維持する方法を理解できない

私はアイテムのリストを持っていますが、リスト内のすべての前のアイテムの合計がXに等しい場合(この場合は10であるため、アイテム1 + 2、次に2 + 3.etcを取ります)しきい値10に達するまで)、私はそれを計算するための方法を使うことができますが、私が本当にやるべきことが最後の項目でインクリメントされ、次にデータがしきい値を超えているかどうかを確認するときに、これまでのところ私のコードですが、実際にはクラスを独立したメソッドとして使用し、すべてのループで再計算するので機能しますが、それは良くありません。私の目標は、この構造を使用して、しきい値をチェックする必要がない場合にループを減らすことです。

提案がありますか?

コード:

public class LearningClassesCounter { 
    public static void main(String[] args) { 
     int[] list = new int[]{1,2,3,4,5,6,7,8,9,10}; 
     int[] data_list = new int[list.length]; 
     for (int current_location = 0; current_location<list.length;current_location++) { 
      //can only put commands in here. Nothing above. 
      Counter checker = new Counter(data_list); 
      System.out.println(checker.check_data(current_location)); 
      for (int i =0; i<100; i++){ 
       if (checker.check_data(current_location) == false) { 
        break; 
       } 
       data_list[current_location] = (list[current_location]+1); //this is just a random function, it could be any math function I just put it in here to show that some work is being done. 
      } 
     } 
     //its done now lets print the results 
     for (Integer item : data_list) { 
      System.out.println(item); 
     } 
    } 
} 


class Counter { 
    private int[] data_list; 
    private int total_so_far; 
    // create a new counter with the given parameters 
    public Counter(int[] data_list) { 
     this.data_list = data_list; 
     this.total_so_far = 0; 
    } 

    public boolean check_data(int current_location) { 
     // TODO Auto-generated method stub 
     int total_so_far = 0; 
     //System.out.println(total_so_far); 
     for (int item : data_list) { 
      total_so_far = item + total_so_far; 
      if (total_so_far >= 10) { 
       break; 
      } 
     } 

     if (total_so_far>=10) { 
      return false; 
     } else { 
      return true; 
     } 
    } 

} 

私は私のコードか何かを修正するために誰を必要としない(私はそれを自分でやりたい、コードはちょうど私がやっているかのアイデアを与えることです)。私は自分のロジックの欠陥にもっと興味を持っています。クラスを設計することについて私がよりよく考えるように、自分の状況に合わせてより適切に適用できる方法かもしれません。

+2

私はこれで何をしようとしているのか分かりません。 – squarephoenix

+0

@ techjunkie.css私はあなたの理解に問題がある特定の部分を明確にすることがうれしいです。 –

+0

私はあなたが達成しようとしていることを知りませんが、check_dataメソッド内でtotal_so_farインスタンス変数を隠しているローカル変数total_so_farを宣言しています。私はあなたがこれをすることを意図していたのか疑問です。 – tronbabylove

答えて

2

解決策は、data_listを直接更新しないことです。代わりに、Counterクラスに、インデックスと値を更新するセッターメソッドが必要です。配列の値を更新し、カウント値も更新します。このような

何か:

class Counter{ 
    private final int[] list; 
    private count = 0; 
    private final maxCount = 10; 


    public Counter(int[] list){ 
     this.list = list; 
    } 

    public boolean updateValueAndCheckPastMax(int index, int value){ 
     list[index] = value; 
     count += value; 
     return count >= maxCount; 
    } 
} 
+0

ありがとう、これはより良い方法のように見えるが、私の実際のプログラムはかなり大きく、これは私に多くのコードを変更させるだろう。いくつかの種類のカウンタを維持するためにクラスを使用することは可能ですか?いくつかの条件に達すると(メソッドを介して)教えてください。 –

+0

はい。何らかの種類のカウンタを保持するクラスを作成し、ある条件に達したときに(メソッドを介して)知ることができます。あなたの質問があいまいであれば、良い答えを期待しないでください。 GIGO –

+0

ありがとう、私はあなたのアドバイスをテストします。曖昧さを残して申し訳ありません。私はたいていの場合、問題を修正して移動したいと思うので、非常に具体的な質問を投稿します。この場合、私は学ぶことを試みているので、より一般的な問題を選んだので、そこから私の理解を得ることができました。 –

1

あなたは道の上にこれを考えている、とカウンターのクラスは、この場合には本当に必要はありません。

私はまた、あなたがこのラインをやっているはずだ理由として興味:

data_list[current_location] = (list[current_location]+1); 

あなたはあなたのDATA_LISTがリストと同じになるようにしたいですが、それぞれの値が1だけインクリメントされ?

<という値のサブ配列を返すだけであれば、forループでこれを行い、カウンタとしてintを使うことをお勧めします。

+0

私はそれについて申し訳なく思っているはずです。その領域は何かをするだけのダミーの仕事です。私の実際のプログラムはそこで実際の作業をしますが、例のために私はそこにランダムに何かを入れます。数学関数でなければなりません。問題のポイントは、いつでも再計算せずに特定のしきい値をどのように監視できるかを理解することです。 –