初学者协助在类之间传输信息



我正在做一个家庭作业,它从.csv文件中获取输入,并将提示用户提出与其中包含的信息(犯罪统计)相关的不同问题。

我的代码如下,现在还为时过早,所以我只是在那里有一些占位符变量,因为我一直在绞尽脑汁试图找出解决这个问题的最佳方法。

import java.io.*;
public class USCrimeArray {
String crimeArray[][] = new String[21][20];
public void createCrimeArray() throws Exception{
String crimeArrayInputString;
int crimeArrayRowValue = -1;
try (BufferedReader crimeArrayInput = new BufferedReader(new FileReader("C:/Users/Joey/Documents/Crime.csv"))) {
while ((crimeArrayInputString = crimeArrayInput.readLine()) != null) {
crimeArrayRowValue++;
crimeArray[crimeArrayRowValue] = crimeArrayInputString.split(",");
}
} catch (IOException io) {
io.getMessage();
}
}
public USCrimeArray(){
String[][] thisArray = crimeArray.clone();
}
public String[][] getCrimeArray(){
return crimeArray.clone();
}
}

这是我第一堂课的代码,如果我在createCrimeArray中做一个deepToString,我会得到我想要的信息。USCrimeArray 的构造函数还没有真正考虑好,我的主要问题是如何将信息写入 crimeArray[][],以便我可以将其带回其他类。

再一次,这个测试主要还没有考虑得太远,因为我仍在纠结为什么我的方法没有使用 while 循环写过 crimeArray[][],如下所示:

import java.util.Arrays;
public class USCrimeClass { 
public static void main(String[] args) {
USCrimeArray crimeArray = new USCrimeArray();
String[][] test = crimeArray.getCrimeArray();
System.out.println(Arrays.deepToString(test));
}
} 

我知道我在这里做错了很多,但这是迄今为止的最终结果,在一遍又一遍地改变一切并且没有取得任何进展之后。系统的结果显然只是一个 21x20 的空元素数组。任何帮助将不胜感激。

您需要在USCrimeClass中调用createCrimeArray()

public class USCrimeClass { 
public static void main(String[] args) {
USCrimeArray crimeArray = new USCrimeArray();
crimeArray.createCrimeArray();
String[][] test = crimeArray.getCrimeArray();
System.out.println(Arrays.deepToString(test));
}
} 

  1. USCrimeArray的构造函数中,您将数组克隆为局部变量thisArray但从不使用它。 这是多余的,可以安全地删除。

  2. getCrimeArray()中,您将返回数组的克隆。 这不是必需的(除非您想保持USCrimeArray不可变)。 您可以只返回数组本身

实例变量

实例变量是非静态类级变量(非常类似于crimeArray)。 可以将实例变量视为有两个目的:

  1. 类的问题域的"详细信息"。 例如Person类将具有实例变量,例如firstNamelastName,它们是一个人的详细信息。

  2. "配置"变量保存与技术环境相关的信息,与类的问题域无关。 例如,有时可能会发现一个类,其中包含一个布尔deleted实例变量,该变量表示不会向用户显示或包含在计算中的"软删除"实例。 这背后的目的是支持撤消删除。

所以crimeArrayUSCrimeArray的类别详细信息。 常见的最佳实践是在类构造函数中初始化实例变量,因此当您完成创建新实例时,您已经拥有一个具有完整且有效详细信息的实例。 所以我会将createCrimeArray()的所有代码移动到构造函数中。

如果需要在初始化实例变量后对其进行修改,则可以使用"setter"方法。 这些具有标准化的签名:public void setCrimeArray(crimeArray[][])。 具有标准化签名允许添加功能的框架和库使用类。 例如,将数据存储在关系数据库中,通过互联网发送/接收数据等。

现在,我看到用于填充数组的外部输入来自文件。 按照现在的编码方式,USCrimeArray只能从预定的文件系统位置读取一个特定文件。 更灵活的方法是让类接收外部输入的规范作为参数:

public USCrimeArray(String filename) {
... 
try (BufferedReader crimeArrayInput = new BufferedReader(new FileReader(filename))) {
... 
}

现在,同一个类可用于处理来自不同文件的数组。 现在你甚至可以把文件名作为Java程序的参数:

public class USCrimeClass { 
public static void main(String[] args) {
USCrimeArray crimeArray = new USCrimeArray(arg[0]);
System.out.println(Arrays.deepToString(test));
}
} 

现在,同一个Java程序可以处理不同的文件,而无需重新编译。

最新更新