我需要从.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();
}
}
答案 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();
}