我正在做一项从.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的null元素数组。任何帮助将不胜感激。
答案 0 :(得分:0)
您需要在createCrimeArray()
USCrimeClass
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));
}
}
另外,
在USCrimeArray
的构造函数中,您将数组克隆到局部变量thisArray
中,但从不使用它。这是多余的,可以安全地删除。
在getCrimeArray()
中,您将返回数组的克隆。这不是必需的(除非你想保持USCrimeArray
不可变)。你可以直接返回数组
实例变量是非静态类级变量(很像crimeArray
)。
可以将实例变量视为两个目的:
该类问题域的“详细信息”。例如,Person
类将包含firstName
和lastName
等实例变量,这些变量是一个人的详细信息。
“配置”变量包含与技术环境相关的信息,与课程的问题域无关。例如,有时可能会找到一个带有布尔deleted
实例变量的类,该实例变量表示“软删除”实例,该实例不会呈现给用户或包含在计算中。这背后的目的是支持撤消删除。
因此crimeArray
属于USCrimeArray
的类别详细信息。常见的最佳实践是在类构造函数中初始化实例变量,因此,当您完成创建新实例时,您将拥有一个具有完整且有效详细信息的实例。所以我会将createCrimeArray()
的所有代码移动到构造函数中。
如果需要在初始化后修改实例变量,则可以使用“setter”方法。这些标签有public void setCrimeArray(crimeArray[][])
。具有标准化签名允许您的类被添加功能的框架和库使用。例如,将数据存储在关系数据库中,通过互联网发送/接收数据等。
现在,我看到用于填充数组的外部输入来自一个文件。现在编码的方式,USCrimeArray
只能从预定的文件syatem位置读取一个特定文件。一种更灵活的方法是让类接收外部输入的规范作为参数:
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程序可以处理不同的文件而无需重新编译。