2017-04-26 139 views
0

我需要从一个.dat文件中获取数据并放入“生命游戏”java程序的一个区域。基本上在这个游戏中,这是一个25x75的棋盘,在它的一些坐标中有单元格。如果他们没有邻居,所以我想把这个电路板放在一个[25 + 1] [75 + 1]阵列中,这样就可以使电路板边缘的单元更简单。从.dat文件创建和打印二维数组

我基本上有两种方法将.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(); 
     } 
    } 
+2

这看起来错乍一看:'为(INT J = 0; fileReader.hasNextLine()'为什么你关心的*** ***内循环下一行?外部循环是,因为你在那里读取行并创建行,但是内部循环填充行,并且行已经被读入。 –

+0

另外你的数组可能不应该有M + 1和N + 1的大小而是M和N的大小,并开始你的for循环在0. –

+0

@HovercraftFullOfEels该死的.hasNextLine()修复它给我。谢谢,没有意识到它是如此简单,而且我会尝试谢谢你的时间! –

回答

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(); 
    }