Не уверен, почему происходит исключение за пределами границ - PullRequest
0 голосов
/ 22 сентября 2019

Исключение из-за пределов, но не понимаю, почему.Моя рекурсивная функция вызывает себя каждый раз, удаляя элемент из списка массивов, пока он не станет пустым.Как только он будет пуст, строка должна быть заполнена, а затем мы добавим значения обратно в список.Я думаю, что в последнем элементе он выдает исключение из-за длины списка, он не хочет удалять последний элемент.Есть ли способ обойти это?Есть ли вероятность, что это другая ошибка?

import java.util.Arrays;
import java.util.Collections;
import java.util.Random;
import java.util.*;

class Main {
public static void main(String[] args) {
    int[][]board=new int[9][9];
    Solver solve = new Solver();
    ArrayList<Integer> choices = new ArrayList<>();
    choices.addAll(Arrays.asList(1,2,3,4,5,6,7,8,9));
    Collections.shuffle(choices);

    for(int i = 0; i < 9; i++){
        for(int j=0; j < 9; j++) {
            solve.fill(board, choices, i, j);
        }
    }
    }
}

class Solver {

public void fill(int board[][], ArrayList<Integer> choices, int 
row, int col) {
    int num = choices.remove(0);
    if (isValid(board, row, col, num) == false) {
        fill(board, choices, row, col);
    } else
        board[row][col] = num;
    return;
}


public boolean isValid(int board[][], int row, int col, int num) {

    if (checkRow(board, row, col, num) == true) 
            /*checkCol(board, row, col, num) == true)*/
        /*checkSqr(board, row, col, num) == true*/
        return true;
    return false;
}

public boolean checkRow(int board[][], int row, int col, int num) {
    boolean valid = true;
    int i = 0;
    while (i < 9) {
        if (board[i][col] == num) {
            return valid = false;
        }
        i++;
    }
    return valid;
}

ожидаемым результатом будет доска [] [], заполняемая случайным образом в соответствии с правилами судоку.вместо этого мы получаем исключение в потоке "main" java.lang.IndexOutOfBoundsException: индекс 0 выходит за пределы длины 0 в Solver.fill (Solver.java:31) в Main.main (Solver.java:22)

1 Ответ

0 голосов
/ 22 сентября 2019

Убедитесь, что у вас все еще есть элемент перед вызовом int num = choices.remove(0);, вы можете использовать List.isEmpty() как

if (choices.isEmpty()) {
    return;
}
int num = choices.remove(0);
...