【问题标题】:read a 2d array from file-Java从文件-Java 中读取二维数组
【发布时间】:2014-03-23 04:29:35
【问题描述】:

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

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

2 3

约翰 44.4 55 66.1

丽莎 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

【问题讨论】:

  • 您的项目是否需要使用二维数组?
  • 是的,你是对的。这是因为字符串的存在。你通过调用 fileReader.next(); 来遍历它;
  • @mig 是的,它说您应该使用二维数组以及任何其他必要的数组。
  • @Sourabh 我尝试了放置 fileReader.next() 但我仍然得到零。我应该使用多个吗?
  • @user3397166 我把我的例子放在下面

标签: java arrays java.util.scanner


【解决方案1】:

你的问题是标题,

从文件-Java 中读取二维数组

但我认为你在这里要做的最后一件事是创建一个二维数组,而你的代码完全忽略了学生的名字。

相反,您应该创建一个 Student 类,该类有两个字段,一个用于保存学生姓名的 String 字段,以及一个用于保存成绩的 ArrayList&lt;Double&gt;double[](您可以选择)。

然后将您在从文件中读取一行数据时创建的每个 Student 对象放入 ArrayList&lt;Student&gt;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

【讨论】:

    【解决方案2】:

    我相信通过查看您的代码,您实际上从未将值放入数组中,并且由于当您打印一个从未有任何关联值的初始化数组时,它会自动打印0.0

    导致您不在数组中放置任何值的原因是您的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();
            }
        }
    }
    

    让我知道这是否适合你!

    【讨论】:

    • 感谢您的帮助!这当然效果更好,但现在它只给了我一个双精度数,这是我在文件中输入的数字行中倒数第二个双精度数。知道什么可以解决这个问题吗?
    【解决方案3】:
    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[][]。另外我假设文件是​​完美的,没有任何 cmets 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      相关资源
      最近更新 更多