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

Beginner assistance with transferring information between classes

我正在做一个家庭作业,它从 .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();
}
}

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

再一次,这个测试 main 没有被想得太远,因为我仍在努力解决为什么我的方法没有用 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() 中,您正在 return 阵列的克隆。这不是必需的(除非你想保持 USCrimeArray 不变)。你可以 return 数组本身

实例变量

实例变量是非静态class级变量(很像crimeArray)。 可以将实例变量视为有两个用途:

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

  2. "configuration" 变量保存与技术环境相关的信息,与 class 的问题域无关。例如,有时可能会发现 class 带有布尔 deleted 实例变量,表示 "soft deleted" 实例不会显示给用户或包含在计算中。这背后的目的是支持撤销删除。

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

如果实例变量初始化后需要修改,可以使用"setter"方法。它们有一个标准化的签名:public void setCrimeArray(crimeArray[][])。拥有标准化的签名允许您的 class 被添加功能的框架和库使用。例如,将数据存储在关系数据库中,sending/recieving 通过 Internet 存储数据等。

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

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

}

现在可以使用相同的 class 来处理来自不同文件的数组。 现在您甚至可以将文件名作为 java 程序的参数:

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

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