从.txt文件构建的2d数组出现问题

时间:2019-09-05 15:36:14

标签: java

我已经可以使用.txt文件创建数组。但是,现在在打印数组时,它会重复打印最后一行而不是之前的最后一行。我相信我分配了正确的值,并确保将它们分配给数组。

我尝试遍历并为每个索引分配正确的值,然后逐行浏览直到所有索引都被分配。最终,这将覆盖所有内容。

private double[][] Grid;

public GridMonitor(String filename) throws FileNotFoundException
{
    Scanner FileName = new Scanner(new BufferedReader(new FileReader(filename)));
    int totalRow = 0;
    while (FileName.hasNextLine())
    {
        String[] string = FileName.nextLine().trim().split(" ");
        totalRow++;
        Grid = new double[totalRow][string.length];
        for(int i = 0; i < totalRow; i++)
        {
            for(int j = 0; j < string.length; j++)
            {
                Grid[i][j] = Double.parseDouble(string[j]);
            }
        }
        System.out.println(Arrays.deepToString(Grid));
    }
    System.out.println(Arrays.deepToString(Grid));
    FileName.close();
}

它应该显示类似于

的结果
  

[3.0] [3.0],[2.0] [10.0] [7.0],[5.0] [6.0] [9.0],[4.0] [5.0] [8.0]

但显示

  

[4.0] [5.0] [8.0],[4.0] [5.0] [8.0],[4.0] [5.0] [8.0],[4.0] [5.0] [8.0]

3 个答案:

答案 0 :(得分:0)

我认为您想念该数组具有这样的行和列:double[][] grid = new double[row][col],所以当您逐行读取文件时,您无法在获得最后一行之前先找出行数。

public static double[][] readGridFromFile(Path file) throws FileNotFoundException {
    final Pattern space = Pattern.compile("\\s+");

    try (Scanner scan = new Scanner(new BufferedReader(new FileReader(file.toFile())))) {
        List<double[]> lines = new ArrayList<>();

        while (scan.hasNextLine()) {
            lines.add(Arrays.stream(space.split(scan.nextLine().trim()))
                            .mapToDouble(Double::parseDouble)
                            .toArray());
        }

        double[][] grid = new double[lines.size()][];
        int row = 0;

        for (double[] line : lines)
            grid[row++] = line;

        return grid;
    }
}

答案 1 :(得分:0)

您的问题是您反复使用Grid = new double[totalRow][string.length];向Grid分配一个新数组,从而覆盖了旧值。

答案 2 :(得分:0)

嵌套的for循环中存在问题,网格每次都由同一行填充。删除外部循环,并将行计数器初始化为0,然后在外部while循环内将其递增。

int rc = 0;
while ( Filename.hasNextLine()){
// Code before Nested For loop
for(j=0;j<string.length;j++){
Grid[rc][j] = // your code
}
rc++;
}