0

我正在尝试学习 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 是一个空指针(我知道我将它声明为空,但如果我将它设为私有 int[] data_list = data_list 它也不会编译)。我的最终目标是进行某种控制,在这种情况下将其限制为 2 个项目,但我还想添加其他限制,例如所有项目的总价值不能超过 X 或不能低于 X,并希望通过以下方式节省 CPU 功率不必每次都进行完整的计算。所以我认为我需要能够增加这些值,然后需要检查这些增量是否超过阈值。

谁能帮我理解我做错了什么?我只是语法错误吗?还是我设计错了?

4

1 回答 1

3

//这里只能放命令。上面什么都没有。计数器检查器 = 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。

于 2012-04-20T04:59:34.753 回答