1

これは数独パズル ソルバーであると想定されており、パズルには 2 次元の ArrayList を使用する必要があります。

txt ファイルの数値を使用して ArrayList を埋めようとしています。私のテスト クラスのコードは、9x9 ArrayList を作成し、2 次元の ArrayList がどのように機能するかをテストするために作成したループを使用して、1 ~ 9 の数字で埋めることができます。

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ファイルから数値を読み取り、それを繰り返すことでArrayListに配置して、txtファイルから最初の9つの数値をArrayListの最初の行に入れ、次の行に移動するようにしましたtxt ファイルの行と ArrayList を使用して、これらの数値を入力します。

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

私はException in thread "main" java.util.NoSuchElementException この行でcell = solutionFile.nextInt();

これはsudoku.txtファイルです

346791528
918524637
572836914
163257489
895143762
427689351
239415876
684372195
751968243

最初はそのように試してみましたが、そのエラーが発生しましたが、すべての数字を取得して1行に配置しようとしたため、forループは一度に9つの数字しか読み取れませんが、テストしてArrayListまたは何を印刷する必要があるかそれらを追加した後、ArrayList全体が空白になります。

ファイルから数値を読み取らずに ArrayList に入れて印刷することの問題は何ですか?

4

1 に答える 1

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

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

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

次のようなものにする必要があります

 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
 }
于 2012-04-27T20:26:35.360 に答える