2012-04-27 12 views
1

これは数独パズルソルバであると考えられており、パズルに2次元のArrayListを使用する必要があります。txtファイルから2次元のArrayListを書き込もうとしています

私は、txtファイルの数値を使用してArrayListを塗りつぶしています。私のテストクラスのコードは、9x9のArrayListを作成し、2次元のArrayListをどのように満たしているかをテストするために作成したループを使って、1から9までの数字で塗りつぶすことができます。私はtxtファイルに保存されている数字を取ると、彼らが読まれる順序でのArrayListを埋めるためにそれらを使用しようとすると、

import java.util.*; 
import java.io.*; 

public class test 
{ 
    public static void main(String args[]) 
    { 
     ArrayList<ArrayList<Integer>> data = new ArrayList<ArrayList<Integer>>(); 

    //Loop to add 9 rows 
    for(int i=1; i<=9; i++) 
    { 
     data.add(new ArrayList<Integer>()); 
    } 

    //Loop to fill the 9 rows with 1-9 
    for(int k=0; k<9; k++) 
    { 
     for(int j=1; j<=9; j++) 
     { 
      data.get(k).add(j); 
     } 
    } 

    //Loop to print out the 9 rows 
    for(int r=0; r<9; r++) 
    { 
     System.out.println("Row "+(r+1)+data.get(r)); 
    } 

    //Reads the file. Need to use this to set the array 
    File file = new File("F:\\Data Structures 244\\FINAL PROJECT\\SudokuSolver\\sudoku.txt"); 

    try { 

     Scanner scanner = new Scanner(file); 

     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 
      System.out.println(line); 
     } 
     scanner.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

私の問題が来ます。私はこのコードを試して、txtファイルから数値を読み込み、それを繰り返して、ArrayListの最初の行にtxtファイルの最初の9個の数値を入力してから、次のこれらの数字を埋めるために、ArrayListと同様にtxtファイル内の行。

File file = new File("F:/Data Structures 244/FINAL PROJECT/SudokuSolver/sudoku.txt"); 

    //Needs this try and catch 
    try { 
     Scanner solutionFile = new Scanner(file); 
      int cell=0; 
     while (solutionFile.hasNextInt()) 
      { 
       //Loop to fill the 9 rows with the numbers from the sudoku.txt 
       for(int k=0; k<9; k++) 
       { 
        for(int j=1; j<=9; j++) 
        { 
        cell = solutionFile.nextInt(); 
        data.get(k).add(cell); 
        } 

       } 
     } 
     solutionFile.close(); 
     } 

     catch (FileNotFoundException e) 
     { 
     e.printStackTrace(); 
    } 

    for(int r=0; r<9; r++) 
     { 
      System.out.println("Row "+(r+1)+data.get(r)); 
     } 

私は私が最初にそのようにそれを試してみましたが、そのエラーを取得しますが、その後、私はすべて取ってみてください。これは、sudoku.txtファイル

346791528 
918524637 
572836914 
163257489 
895143762 
427689351 
239415876 
684372195 
751968243 

あるcell = solutionFile.nextInt();

この行でException in thread "main" java.util.NoSuchElementException を取得私のforループは一度に9つの数字だけを読み込みますが、ArrayListを印刷するかどうか、またはArrayListを追加した後に何を入れるべきかはArrayList全体が空白になります。

ファイルから数字を読み取って、ArrayListに入れて印刷しない問題は何ですか?

+0

この宿題はありますか?ファイルがどこにあるのかわかります。 – Makoto

答えて

4

整数は複数の文字にすることができます。あなたは1つの数字として行全体を読んでいて、9回の読み込みを終えると失敗します(行ごとに1つ)。

番号が分割されているように、あなたは、あなたのテキストファイルを再フォーマットすることができます(私はスペースは間違いないに新しい行をします仕事と考えている)

をそう

3 4 6 7 9 1 5 2 8 
... 

それとも、読むことができるように全体の数と

int temp = solutionFile.nextInt(); 

for(int i = 8; i > 0; i--) { 
    int cell = temp/(10 * i); 
    data.get(k).add(cell); 
} 

//add the last cell 
int cell = temp % 10; 
data.get(k).add(cell); 

それとも、文字列として値を読み、

それを解析でき、それを自分で解析
String line = solutionFile.next(); 

for(int i = 0; i < line.length; i++) { 
    Integer cell = Integer.parseInt(line.substring(i, i+1)); 
    data.get(k).add(cell); 
} 

これは

のようなものであるべき

for(int r=0; r<9; r++) 
    { 
     System.out.println("Row "+(r+1)+data.get(r)); 
    } 

(ArrayListののtoStringは、あなたがそれを手動で行う必要がありますあなたのためのリストは印刷されません)番号のリストを印刷するための有効な方法ではありません

for(int r = 0; r < data.size(); r++) 
{ 
    System.out.print("Row " + (r+1) + ": "); 
    for(Integer num : data.get(r)) { 
     System.out.print(num + " "); 
    } 
    System.out.println(); //to end the line 
} 
+0

ありがとう私は頭の中で別々の数字として扱っていたことに気づいていませんでしたが、それは私がファイルに入れるようにしたものではありません。 – Icegoten

関連する問題