从file-Java读取2d数组

时间:2014-03-23 04:29:35

标签: java arrays java.util.scanner

编辑:我已经解决了这个问题。我没有正确读取文件顶部的第二个数字,所以我得到一个方阵。我通过使用scanner.next()跳过第一个数字来解决它。我将在下面发布更正后的代码。感谢大家的帮助。

我正在尝试学习文件i / o,项目是否已阅读您创建的文件。该文件以两个数字开头,这两个数字是一个班级中的学生数量和要评分的项目数量,然后是一个以名称开头的大矩阵,然后是要平均的分数。像这样:

2 3

John 44.4 55 66.1

Lisa 33 44 55

完全更正的方法(尽管仍需要对异常处理进行微调):

public static double[][] getArrays(String fileName, int num1, int num2) {
    double[][] twoDArray = new double[num1][num2];
    String[] names = new String[num1];
    try {
        Scanner fileReader = new Scanner(new File(fileName)); //Create a scanner               
        fileReader.nextLine();
         do {
            for (int i = 0; i < num1; i++) {
                names[i] = fileReader.next();
                System.out.println(names[i]);
                for (int j = 0; j < twoDArray[0].length; j++) {
                    twoDArray[i][j] = fileReader.nextDouble();
                }
                fileReader.nextLine();
            }
        } while (fileReader.hasNext());
    } catch (FileNotFoundException | NoSuchElementException ex) { //Catch any exceptions
        System.out.println("Exception caught");
    }
    return twoDArray;
}// end of get2DArray method

3 个答案:

答案 0 :(得分:0)

您的问题标题为

  

从file-Java

读取一个2d数组

但我认为你最不想做的就是创建一个2D数组,而你的代码完全忽略了学生的名字。

相反,你应该创建一个Student类,一个有两个字段的字符串,一个用于保存学生姓名的字符串字段,以及一个ArrayList<Double>double[],用于保存等级。

然后将您在阅读时创建的每个Student对象放入文件中的一行数据中,再次选择ArrayList<Student>Student[]数组。

如果你使用数组(我猜测你的类是你的要求),那么伪代码可能是:

create File Scanner object, fileScanner
read line, 
create line Scanner with line, 
get both ints studentCount and gradeCount, and store in variables.
dispose of line Scanner
Create Student array
??? possibly read an empty line (if your file representation is accurate). 
for index goes from 0 to < student count
  read line with File Scanner
  create line Scanner with line
  next token goes into a name String
  create 1-D double array
  for other index goes from 0 to < gradeCount
    use line scanner to get doubles and put into one double array
  end for loop
  dispose of line scanner
  create Student object with name and double array, 
  place Student object into Student array
end for loop
dispose of file scanner

答案 1 :(得分:0)

我相信从你的代码中看到你实际上并没有将值放入数组中,并且由于当你打印一个从未有任何关联值的初始化数组时它会自动打印0.0 < / p>

导致你不在数组中放入任何值的原因是你的while(fileReader.hasNextDouble())这正在搜索下一个双重字符串,但字符串位于那里,所以你的while循环没有发生。 (为了将来参考调试,在while循环中添加一个简单的System.out.println("Hit");将告诉您是否到达那里)。根据你的txt文件的结构,我会做一些更改,我将代码放在下面。

while (fileReader.hasNext()) {
    for (int i = 0; i < num1FromFile; i++) {
        fileReader.next();
        for (int j = 0; j < num2FromFile; j++) {
            twoDArray[i][j] = fileReader.nextDouble();
        }
    }
}

让我知道这是否适合您!

答案 2 :(得分:0)

public static double[][] getArrays(String fileName) throws Exception {
    Scanner scanFile = new Scanner(new File(fileName));
    int numNames = scanFile.nextInt();
    int numScores = scanFile.nextInt();
    double[][] scores = new double[numNames][numScores];
    String[] names = new String[numNames];

    for(int i = 0; i < numNames; i++) {
        names[i] = scanFile.next();
        for(int j = 0; j < numScores; j++) {
            scores[i][j] = scanFile.nextDouble();
        }
    }
    scanFile.close();
    return scores;
}

在使用之前尝试理解逻辑。上面的代码中可能存在拼写错误,因为我在此处直接输入。 names被读入数组但未使用。我相信你对名字不感兴趣,因为你的方法只返回double[][]。另外我假设文件很完美,没有任何评论等。