Последняя строка текстового файла не сохраняется правильно в 2D массив - PullRequest
0 голосов
/ 06 апреля 2020

Мой сканер неправильно обращается к последней строке моего текстового файла, поэтому сохраняет последнюю строку текстового файла как все 0 в моем 2D-массиве вместо того, что на самом деле там. Я полагаю, что предоставил все, что дало бы контекст в отношении того, что идет не так, но если потребуется дополнительная информация, я могу обновить этот вопрос, заранее спасибо.

//Creates 2-d array object, stores values from file.
public DominoSort (String fileName) throws java.io.FileNotFoundException{
    this.grid = new int [7][8]; //2-d array to hold values from text file

    Scanner br = new Scanner(new File(fileName));
    String line = br.nextLine();

    int r = 0;
    int c = 0;

    while (br.hasNextLine) {
        String[] row = line.split("\\s+");
        for (String s : row) {
            this.grid[r][c] = Integer.parseInt(s);
            c++;
        }
        line = br.nextLine();
        r++;
        c = 0;
    }

    //this.setS = new ArrayList<>();
    //this.pairMappings = new ArrayList<ArrayList<dominoLocation>>();

    br.close();
}

//Print grid function, prints out the grid
public void printGrid() {
    for(int r = 0; r < this.grid.length; r++) {
        System.out.println("");
        for(int c = 0; c < this.grid[r].length; c++) {
            System.out.print(this.grid[r][c] + " ");
        }
    }
    System.out.println("");
}

//Driver for checking
public static void main(String[] args) throws IOException {
    // String line;
    //System.out.println(new File(".").getAbsolutePath());
    Scanner input = new Scanner(System.in); //get textfile name from user input
    System.out.print("Enter the file name: ");
    String fileName = input.next();

    DominoSort dom = new DominoSort(fileName); //this call populates the 2-d array object
    //dom.solvePuzzle(6);
    dom.printGrid(); //prints 2d array for output

    //dom.solvePuzzle(6);
}

текстовый файл, используемый для тестирования / ожидаемого вывода :

3 3 4 2 2 0 0 0
4 6 3 6 3 1 4 1
5 5 4 1 2 1 6 5
5 6 0 2 1 1 5 3
5 4 4 2 6 0 2 6
3 0 4 6 6 1 3 1
2 0 3 2 5 0 5 4    {Notice this line}

фактическая мощность:

3 3 4 2 2 0 0 0
4 6 3 6 3 1 4 1
5 5 4 1 2 1 6 5
5 6 0 2 1 1 5 3
5 4 4 2 6 0 2 6
3 0 4 6 6 1 3 1
0 0 0 0 0 0 0 0    {this line is not right}

1 Ответ

0 голосов
/ 06 апреля 2020

Ваша проблема лежит во вложенном while / for l oop. Он достигает конечного состояния до того, как все строки будут прочитаны. (У метода nextLine () больше нет строк до того, как вы прочитаете последнюю строку). Вы можете увидеть это, добавив дополнительные 1 или 2 строки в ваш файл в самом конце, чтобы он отображал последние строки. Есть несколько способов исправить это, один из них - просто добавить дополнительную для l oop через некоторое время l oop для вычисления последней строки индивидуально:

    while (br.hasNextLine()) {

        String[] row = line.split("\\s+");

        for (String s : row) {
            this.grid[r][c] = Integer.parseInt(s);
            c++;
        }

        line = br.nextLine();
        r++;
        c = 0;
    }

    String[] row = line.split("\\s+");
    for (String s : row) {
        this.grid[r][c] = Integer.parseInt(s);
        c++;
    }

или, альтернативно, не увеличивайте строку при первом запуске:

        while (br.hasNextLine()) {

            String[] row = line.split("\\s+");

            for (String s : row) {
                this.grid[r][c] = Integer.parseInt(s);
                c++;
            }

            if (r != 0) 
                line = br.nextLine();

            r++;
            c = 0;
        }
...