0

私は OOP を初めて使用します。通常、すべてのコードを 1 つのクラスに入れ、メソッドを使用します。しかし、状態情報を維持したいので、クラスが最適だと思いますが、頭を悩ませています。

アイテムのリストがあり、リスト内の以前のすべてのアイテムの合計が X (この場合は 10 なので、アイテム 1 + 2、次に 2 + 3 など) になったときに停止したいとします。しきい値 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;
        }
    }

}

コードなどを修正する人は必要ありません(自分でやりたいのですが、コードは自分が何をしているのかを理解するためのものです)。私は自分のロジックの欠陥にもっと興味があり、クラスの設計についてよりよく考えて、自分の状況により良く適用できるようにする方法かもしれません。

4

2 に答える 2

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;
    }
}
于 2012-04-20T16:39:24.490 に答える
1

あなたはこれを考えすぎており、この場合、カウンタークラスは実際には必要ありません.

また、なぜこの行を実行するのかについても興味があります。

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

data_list を list と同じにしたいが、各値を 1 ずつ増やしますか?

10 未満の値のサブ配列を返そうとしているだけの場合は、for ループでこれを行い、int をカウンターとして使用することをお勧めします。

于 2012-04-20T16:39:35.527 に答える