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;
        }
    }

}

我不需要任何人来修复我的代码或任何东西(我想自己做,代码只是为了让我知道我在做什么)。我对我的逻辑缺陷更感兴趣,也许是一种让我更好地考虑设计类的方法,这样我就可以更好地将它们应用到我自己的情况中。

4

2 回答 2

2

所以解决方案是你不data_list直接更新。而是在Counter类中有一个 setter 方法来更新索引和值。它更新数组中的值并更新计数值。

像这样的东西:

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 与列表相同,但每个值都增加 1?

如果您只是试图返回 < 10 的值的子数组,我建议只在 for 循环中执行此操作,并使用 int 作为计数器。

于 2012-04-20T16:39:35.527 回答