用文本文件填充二维数组的方法

时间:2017-03-10 16:49:04

标签: java

目前我正在开发一个创造生命游戏的项目,但是我正在努力编写我必须使用的第一种方法之一。基本上,它必须读入文本文件并将其填入二维数组。现在我在main中遇到一个错误,上面写着“线程中的异常”主“java.util.NoSuchElementException:找不到行”。任何帮助将不胜感激。顺便说一句,我应该提一下,在文件中我知道行数,但想让它像我不知道行数/列数。

import java.util.*;
import java.io.*;
public class Proj5testing {
public static void main (String[] args)throws IOException{
    Scanner inFile = new Scanner(new File("life4.txt"));
    System.out.print(readBoard("life4.txt"));

}

public static int[][] readBoard(String filename)throws IOException{
    int rows=0;
    Scanner inFile = new Scanner(new File(filename));
    while (inFile.hasNextLine()) {
          rows++;
          inFile.nextLine();
        }
    int cols=Integer.parseInt(inFile.nextLine());
    int[][] grid=new int[rows][cols];
    for(int i=0;i<grid.length;i++){
        for(int k=0;k<grid[rows].length;k++){
            grid[i][k]=inFile.nextInt();

        }
    }
    return grid
}
}

3 个答案:

答案 0 :(得分:1)

看看这段代码:

while (inFile.hasNextLine()) {
    rows++;
    inFile.nextLine();
}

这将循环直到没有更多行。当循环退出时,hasNextLine()将为假(否则循环不会退出)。

然后立即致电:

int cols=Integer.parseInt(inFile.nextLine());

但我们已经确定文件中没有下一行!所以当然会引发错误。

相反,您需要处理循环中的每一行。我不知道你的文件的确切结构,但它会是这样的:

int[][] grid=new int[rows][cols];
int col = 0;
int row = 0;
while (inFile.hasNextInt()) {
    grid[col][row] = inFile.nextInt();
    col = col + 1;
    if (col == cols) { //wrap to the next row
        row = row + 1;
        col = 0;
    }
}

答案 1 :(得分:1)

问题是您正在尝试阅读inFile中的下一行,但由于您已经读取了while循环中的所有行,因此没有下一行。

您必须重新声明Scanner对象才能再次从头开始阅读。

答案 2 :(得分:0)

当while循环结束时,扫描程序已到达文件末尾。因此,没有更多的行(或整数)可供阅读。要解决此问题,您可以在for循环之前重新初始化扫描程序。

inFile = new Scanner(new File(filename));

您的代码还存在其他一些问题。看看下面修改过的代码(这可能会做你想要的):

import java.util.*;
import java.io.*;

public class Proj5testing {

    public static void main (String[] args) throws IOException {
        // System.out.print(readBoard("life4.txt"));
        // this will just print a referenceId; if you want to print the contents, you need to write a loop to iterate over all the elements

        int[][] board = readBoard("life4.txt");
        for(int i = 0; i < board.length; i++) {
            for(int j = 0; j < board[i].length; j++) {
                System.out.print(board[i][j]);
            }
            System.out.println();
        }
    }

    public static int[][] readBoard(String filename) throws IOException {
        int rows = 0;
        String line = "";
        Scanner inFile = new Scanner(new File(filename));
        while(inFile.hasNextLine()) {
            rows++;
            line = inFile.nextLine();
        }

        // int cols = line.split("\\s+").length;
        // assuming that the file has space-separated integers in different lines
        // e.g.
        // 0 0 1 0 1
        // 0 0 0 0 1
        // 1 1 1 1 1
        // since the file doesn't have space-separated integers, updating the answer

        int cols = line.length();
        // assuming that the file has lines in the following format
        // 001001001
        // 110011011

        inFile = new Scanner(new File(filename));
        // this will bring the scanner back to the start of the file

        int[][] grid = new int[rows][cols];
        for(int i = 0; i < rows; i++){
            line = inFile.nextLine();
            for(int k = 0; k < cols; k++){
                grid[i][k] = line.charAt(k) - '0';
            }
        }
        return grid;
    }
}