2017-04-26 12 views
0

.datファイルからデータを取り出し、 "game of life" Javaプログラム用の領域に入れる必要があります。基本的にこのゲームでは、その座標の一部に細胞を持つ25x75のボードが使われています。彼らが隣人を持たない場合、いくつかの細胞が死んでいるということについて、この全部が死に至るので、私は[25 + 1] [75 + 1]配列にボードを置こうとしているので、ボードの端にある細胞の方が簡単です。.datファイルから2D配列を作成して印刷する

基本的には、.datファイルのデータを配列に格納する2つのメソッドと、配列を出力するメソッドがあります。しかし、何らかの理由で配列が印刷されると、配列は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のサイズで、0からループを開始してください。 –

+0

@HovercraftFullOfEels .hasNextLine()を取り除くと、私のために修正されました。ありがとうございました。あなたのお時間をありがとう! –

答えて

0

は、この行::fileReader.hasNextLine()は内部ループのループ条件として属していない、以来、そのループが呼び出された相続人は、私がこれまで持って

重要な行はすでにファイルから抽出されており、この状態ではファイルの最後の行が処理されません。また、あなたのコードはJavaライブラリとの戦いであり、通常の使用方法やコードを読んでいる人やあなたの将来の自己を混乱させる可能性があるので、配列の長さをMとNに変更し、+ 1のバージョンは変更しないことをお勧めします学び、摂取した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(); 
    } 
関連する問題