从.dat文件创建和打印2D数组

时间:2017-04-26 19:53:42

标签: java arrays 2d

我需要从.dat文件中获取数据并将其放入一个生活游戏的区域中。 java程序。基本上在这个游戏中,有一个25x75的板,在其一些坐标中有单元格。如果他们没有邻居那么一些细胞死亡,这整个事情都是如此,所以我试图将电路板放在[25 + 1] [75 + 1]阵列中,这样对于边缘的细胞来说,事情就更简单了。板。

我基本上有两种方法将.dat文件中的数据放入一个数组中,一种方法来打印数组。但是,打印时阵列由于某种原因只有24行。基本上一切似乎都很好,除了它不打印板的最后一行。知道代码出了什么问题吗?任何帮助表示赞赏。

到目前为止我所拥有的:

import java.util.Scanner;
import java.io.*;
public class GameOfLife {
    final public int M = 25;
    final public int N = 75;
    public char oldGen [][] = new char [M+1][N+1];
    public char newGen [][] = new char [M+1][N+1];

    public GameOfLife(){
        Scanner consoleReader = new Scanner(System.in);
        char [][] initialGen = new char [M+1][N+1];
        System.out.print ("Enter a filename: ");
        String filename = consoleReader.next();
        File file = new File(filename);
        Scanner fileReader = null;
        try{ 
           fileReader = new Scanner (file);
        }catch (Exception e) {
           System.out.print("File " + file + " does not exist.");
           System.exit(0);
        }for (int i = 1; fileReader.hasNextLine() && i <= M; i++) {
            char [] chars = fileReader.nextLine().toCharArray();
            for(int j = 0; fileReader.hasNextLine() && j < N; j++){
                initialGen[i][j] = chars[j];
            }
        }
        System.out.println("Initial Generation:");
        printGen(initialGen);
        this.oldGen = initialGen;
        consoleReader.close();
    }
    public void printGen(char gen[][]){
        for(int i = 1; i <= M; i++){
            for(int j = 0; j < N; j++){
                System.out.print(gen[i][j]);
            }
            System.out.println();
        }
    }

1 个答案:

答案 0 :(得分:0)

如注释中所述,这一行:fileReader.hasNextLine()不属于内循环中的循环条件,因为当调用该循环时,重要的行已经从文件中提取出来,这个条件将会防止处理文件的最后一行。我还建议您将数组长度更改为M和N而不是+ 1版本,因为您的代码正在与Java库作斗争以及它是如何正常使用的,并且可能会使阅读代码的人或您的未来感到困惑在学习并摄取Java标准之后,我们会自我解决。

作为副本,请注意Java 8可以让您更简单地读取和拆分文件,让代码为您计算出数组长度。这样的事情可以奏效:

    String[][] array = null;
    try (Stream<String> lines = Files.lines(Paths.get(filePathString))) {
        array = lines.map(s -> s.split(""))
                     .toArray(String[][]::new);
    } catch (IOException e) {
        e.printStackTrace();
    }