gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:24:47 25 4
gpt4 key购买 nike

我正在尝试学习 Java,基本上我的方法是采用我在 Python 中学到的过程风格,并将其应用到 Java 中。所以我从不使用类,只是将所有内容放在一个具有许多方法的类中(我只是将其用作 python 函数)。我认为我遇到了问题,需要硬着头皮使用类,但我很难弄清楚如何做到这一点。

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

没有类(class):

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 循环上方放置任何内容,但我可以在其下方放置任何内容,所以我想,与其每次都进行计数,也许我可以使用一个类来以某种方式维护状态并仅递增数字而不是每次都重新计算。

有类:

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

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

最佳答案

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

关于java - 如何将现有的过程代码转换为使用类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10240370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com