2017-04-26 44 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(); 
    }