如何将现有的过程代码转换为使用类?

时间:2012-04-20 04:41:52

标签: java oop

我正在尝试学习Java,基本上我的方法是采用我在python中学到的程序风格,并将其应用于Java。所以我从不使用类,只是把所有东西放在一个有很多方法的类中(我只是用作python函数)。我想我遇到了一个问题,需要咬紧牙关并使用课程,但我无法绕过如何做到这一点。

为了简化我的问题(忽略糟糕的设计 - 它只是为了说明这一点),我有一个程序,它接受一个列表并在for循环中对每个项目进行一些数学运算(在这种情况下,将值加1)列表)。我只希望它对列表中的2个项目进行工作然后停止(在这个例子中它是前2个项目,但在我的真实程序中它可能在列表中的任何位置)。这是与我已经完成的工作代码类似的工作代码:

没有课程:

public class LearningClasses {
    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++) {
            for (int i =0; i<100; i++){
                if (check_size(data_list) == false ) {
                    break;
                }
                data_list[current_location] = (list[current_location]+1);
            }
        }

        //its done now lets print the results
        for (Integer item : data_list) {
            System.out.println(item);
        }
    }

    private static boolean check_size(int[] data_list) {
        // TODO Auto-generated method stub
        int count = 0;
        for (int item : data_list) {
            if (item != 0) {
                count++;
                if (count>=2) {
                    break;
                }
            }
        }
        if (count>=2) {
            return false;
        } else {
            return true;
        }
    }
}

这段代码的问题虽然它起作用但效率低,因为它计算第二个for循环的每次迭代的计数。在我的程序中,我不能把任何东西放在第一个for loop之上,但是我可以把它放在它下面,所以我想每次也许我可以使用一个类以某种方式维持状态并且只是增加数量而不是计数每次重新计算。

使用课程:

public class LearningClassesCounter {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        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());
            for (int i =0; i<100; i++){
                data_list[current_location] = (list[current_location]+1);
            }
        }

        //its done now lets print the results
        for (Integer item : data_list) {
            System.out.println(item);
        }
    }
}


class Counter {
    private int count;             // current value
    private boolean continue_or_not;
    private int[] data_list;

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

    public boolean check_data() {
        // TODO Auto-generated method stub
        int count = 0;
        for (int item : data_list) {
            if (item != 0) {
                count++;
                if (count>=3) {
                    break;
                }
            }
        }

        if (count>=3) {
            return false;
        } else {
            return true;
        }
    }

    // increment the counter by 1
    public void increment() {
        count++;
    } 

    // return the current count
    public int value() {
        return count;
    } 
}

这不起作用,因为它认为data_list是一个空指针(我知道我声明它为null,但如果我将它设为私有int [] data_list = data_list,它也不会编译)。我的最终目标是拥有某种控件,在这种情况下它将其限制为2项,但我还要添加其他限制,例如al items的总值不能超过X或不能低于X并希望节省CPU功率不必每次都做完整的计算。所以我认为我需要能够增加值,然后需要检查那些增量是否未超过阈值。

任何人都可以帮助我理解我做错了什么吗?我只是语法错了;还是我设计错了?

1 个答案:

答案 0 :(得分:3)

//只能在这里输入命令。上面没什么。             Counter checker = new Counter(data_list);             的System.out.println(checker.check_data());

当你调用checker.check_data()时,它试图通过data_list解析,但它是空的。因此,它会抛出NullPointerException。 data_list为空,因为在构造函数中,您可能需要像this.data_list = data_list而不是data_list = this.data_list进行初始化(此处this.data_list没有引用,因此为NULL)

如果你避免这个电话,输出将是2,3,4,5,6,7,8,9,10,11。