Java 从文件读入并添加到二维阵列

Java 从文件读入并添加到二维阵列,java,arrays,Java,Arrays,我有两个不同的程序,其中一个包含一个“addGrade”方法,用于向2D数组(gradeTable)添加新的等级。二维数组中的一个数组是每个等级应包含的类别,第二个元素是每个类别的等级。以下是该计划: public class GradeBook { private String name; private char[] categoryCodes; private String[] categories; private double[] categoryWeights; private

我有两个不同的程序,其中一个包含一个“addGrade”方法,用于向2D数组(gradeTable)添加新的等级。二维数组中的一个数组是每个等级应包含的类别,第二个元素是每个类别的等级。以下是该计划:

public class GradeBook {


private String name;
private char[] categoryCodes;
private String[] categories;
private double[] categoryWeights;
private double[][] gradeTable;

public GradeBook(String nameIn, char[] categoryCodesIn, 
  String[] categoriesIn, double[] categoryWeightsIn) {

  name = nameIn;
  categoryCodes = categoryCodesIn;
  categories = categoriesIn;
  categoryWeights = categoryWeightsIn;
  gradeTable = new double[5][0];
}

public boolean addGrade(String newGradeIn) {     

  char row = newGradeIn.charAt(0);
  int grade = Integer.parseInt(newGradeIn.substring(1));

  double[] oldArr = gradeTable[row];
  double[] newArr = Arrays.copyOf(oldArr, oldArr.length + 1);
  newArr[newArr.length - 1] = grade;
  gradeTable[row] = newArr;

  return row != 0; 
}
public class GradeBookApp {

  String fileName = "";
  String name = "";
  char[] categoryCodes = new char[5];
  String[] categories = new String[5];
  double[] categoryWeights = new double[5];
  double[][] gradeTable;


  if (args.length > 0) {

     for (int i = 0; i < args.length; i++) {
        System.out.println("Reading file \"" + args[i] + "\"." 
           + "\n\tCreating GradeBook object."
           + "\n\tAdding grades to GradeBook object."
           + "\nProcessing of file complete.");


        fileName = args[i];
        Scanner scanFile = new Scanner(new File(fileName));

        name = scanFile.nextLine();
        int catCodes = Integer.parseInt(scanFile.nextLine());

        for (i = 0; i < catCodes; i++) {
           String[] all = scanFile.nextLine().split(" ");
           if(all.length == 3 && all[0].length() == 1 && all[2].matches("(\\d+\\.\\d+)")){
              categoryCodes[i] = all[0].charAt(0);
              categories[i] = all[1];
              categoryWeights[i] = Double.parseDouble(all[2]);
           }
        }

        GradeBook myGB = new GradeBook (name, categoryCodes, 
           categories, categoryWeights);
第二个程序作为命令参数读入文件。粗体文本表示正在读取的等级。字母代表每个年级应该属于的类别,数字是实际的年级。文件是

Student1
5.
a活动0.05
q小测验0.10
p项目0.25
e:0.30
f期末成绩0.30
**a100 a95 a100 a100 a100 a100
q90 q80 q100 q80 q80 r90
p100 p95 p100 p85 p100
e77.5 e88
f92**
在第二个程序中,我尝试循环遍历文件中的每个级别,并对其调用addGrade方法,以便将其添加到2D数组中。我不确定如何为每个年级调用该方法。另外,我很确定我的addGrade方法是不对的。任何帮助都将不胜感激。这是第二个节目:

public class GradeBook {


private String name;
private char[] categoryCodes;
private String[] categories;
private double[] categoryWeights;
private double[][] gradeTable;

public GradeBook(String nameIn, char[] categoryCodesIn, 
  String[] categoriesIn, double[] categoryWeightsIn) {

  name = nameIn;
  categoryCodes = categoryCodesIn;
  categories = categoriesIn;
  categoryWeights = categoryWeightsIn;
  gradeTable = new double[5][0];
}

public boolean addGrade(String newGradeIn) {     

  char row = newGradeIn.charAt(0);
  int grade = Integer.parseInt(newGradeIn.substring(1));

  double[] oldArr = gradeTable[row];
  double[] newArr = Arrays.copyOf(oldArr, oldArr.length + 1);
  newArr[newArr.length - 1] = grade;
  gradeTable[row] = newArr;

  return row != 0; 
}
public class GradeBookApp {

  String fileName = "";
  String name = "";
  char[] categoryCodes = new char[5];
  String[] categories = new String[5];
  double[] categoryWeights = new double[5];
  double[][] gradeTable;


  if (args.length > 0) {

     for (int i = 0; i < args.length; i++) {
        System.out.println("Reading file \"" + args[i] + "\"." 
           + "\n\tCreating GradeBook object."
           + "\n\tAdding grades to GradeBook object."
           + "\nProcessing of file complete.");


        fileName = args[i];
        Scanner scanFile = new Scanner(new File(fileName));

        name = scanFile.nextLine();
        int catCodes = Integer.parseInt(scanFile.nextLine());

        for (i = 0; i < catCodes; i++) {
           String[] all = scanFile.nextLine().split(" ");
           if(all.length == 3 && all[0].length() == 1 && all[2].matches("(\\d+\\.\\d+)")){
              categoryCodes[i] = all[0].charAt(0);
              categories[i] = all[1];
              categoryWeights[i] = Double.parseDouble(all[2]);
           }
        }

        GradeBook myGB = new GradeBook (name, categoryCodes, 
           categories, categoryWeights);
公共类GradeBookApp{
字符串fileName=“”;
字符串名称=”;
char[]categoryCodes=新字符[5];
字符串[]类别=新字符串[5];
double[]类别权重=新的double[5];
双[][]评分表;
如果(args.length>0){
对于(int i=0;i
最好将每个等级列表作为
ArrayList
而不是
double[]
。在JVM(和程序员!)上,每次都要复制整个数组,以便可以增加其长度并添加一个新的。如果使用
ArrayList等级列表,那么就可以

gradeList.add(grade);
不需要做所有的复制

我也会考虑将较大的结构作为一个<代码> map >代码>而不是一个数组。因此,不是有一个二维数组,而是可以有一个<代码> HashMap < /C> >将该行映射到该行的等级列表中。这样就避免了在当前(隐含)的字符和双倍之间进行转换。

最后,
addGrade()
方法应该采用
char
double
(一行和一个新的等级),而不是
String
:您必须处理不适当的数据结构,这是在为自己做大量工作

完成此操作后,为每个项目调用
addGrade
应该相当容易。一旦提取了表示特定等级的
String
(例如,
String gr=“e77.5”
),则可以将其添加到
HashMap gradeMap
内的列表中,如下所示:

char row = gr.charAt(0);
double grade = Double.parseDouble(gr.substring(1));
gradeMap.get(row).add(grade);

如果你需要更多的帮助,我想你需要提供更多的信息。

你说你需要从文件中读取,但是你的代码实际上没有一个是从文件中读取的。这应该是你的第一步。试着查看文档以及本网站上关于执行文件IO操作的正确方法的大量帖子

我假设您将成绩存储在2D成绩表数组中,如:
{Category,grade}
。您需要读取文件中的每一行(BufferedReader有相应的方法),将字符串(查看文档,特别是拆分或子字符串/indexOf方法)解析为Category和grade,然后填充数组


考虑使用更动态的数据结构,例如
ArrayList
。这将允许您在添加更多等级时扩展大小,并且不必在每次大小扩展时都将数组复制到新数组中。

我添加了读取该文件的第二个方法。我已经读取了该文件的前七行,但我有单个等级有问题。此外,我必须使用数组。我必须使用数组。我添加了第二个程序,该程序读取文件并将元素添加到不同的变量和数组中。我已经完成了文件的前几行,但在每个等级上从另一个文件调用addGrade方法时遇到问题。@me123 Wh你必须使用阵列吗?(这似乎有点像发现有人用鞋跟敲钉子,给他一把锤子,他回答说他非常感激,但他只需要使用一只鞋……)哈哈,是的,我知道。我一直都在使用ArrayList,我正在尝试更多地了解数组。我知道这很愚蠢,但我想知道我实际上知道如何使用数组。@me123那么,对于最适合使用数组的对象使用数组怎么样?也许可以编写一个就地快速排序或其他什么?