0

Я не совсем уверен, почему я получаю индекс массива Out Of Bounds Exception. Насколько я понимаю, мой двойной массив имеет размер 3, поэтому индекс идет от 0 до 2. В моем методе isSolvable я пытаюсь подсчитать количество инверсий в моем двойном массиве, где инверсия представляет собой любую пару блоков i и j, где i < j, но я появляется после j, рассматривая плату в строчном порядке. Я пытаюсь сделать это, преобразовывая свой 2d-массив в 1-й массив, чтобы я мог пройти через массив 1d, чтобы подсчитать все инверсии. Если инверсии четные (в пределах доски с нечетным номером), то 8 головоломок разрешимы. Мои циклы for только учитывают длину массива, поэтому я не совсем уверен, как я получаю исключение из массива Out Of Bounds.Индекс массива за пределами границ - преобразование 2d в 1d

Заранее благодарен! Каждый ответ помогает и мешает мне совершать те же ошибки в будущем.

int N = 3; 
static int [][] copy; 

//construct a board from an N-by-N array of blocks 
//(where blocks[i][j] = block in row i, column j) 
public Board(int[][] blocks){ 
    blocks = new int[N][N]; //creates array of size N 

    //generates random numbers 0 inclusive to # exclusive 
    //creates ArrayList - shuffle used to prevent repeating of numbers 
    List<Integer> randomList = new ArrayList<>(); 
    for (int i = 0; i < 9; i++){ 
     randomList.add(i); 
    } 
    int counter = 0; 
    Collections.shuffle(randomList); 
    for (int i = 0; i < blocks.length; i++){ 
     for (int j = 0; j < blocks[i].length; j++){ 
      blocks[i][j] = randomList.get(counter); 
      counter++; 
     } 
    } 
    copy = blocks.clone(); 
} 


//is the board solvable? 
public boolean isSolvable(){ 
    int inversions = 0; 
    List<Integer> convert = new ArrayList<>(); // used to convert 2d to 1d 
    for (int i = 0; i < copy.length; i++){ 
     for (int j = 0; i < copy[i].length; j++){ 
      convert.add(copy[i][j]); //ARRAYINDEXOUTOFBOUNDSEXCEPTION: 3 
     } 
    } 
    for (int i = 0; i < copy.length; i++){ //counts the number of inversions 
     if (convert.get(i) < convert.get(i-1)){ 
      inversions++; 
     } 
    } 
    if (inversions % 2 == 0){ 
     return true; //even 
    } 
    return false; //odd 
} 

//unit test 
public static void main(String[] args){ 
    //prints out board 
    printArray(); 
    Board unittest = new Board(copy); 
    unittest.isSolvable(); //ARRAYINDEXOUTOFBOUNDSEXCEPTION: 3 



} 

ответ

4

У вас есть опечатка во внутреннем цикле isSolvable:

for (int j = 0; i < copy[i].length; j++){ 
       ^
       | 
      should be j 

должно быть:

for (int j = 0; j < copy[i].length; j++){ 
+0

Большое спасибо! – cannotcompute

0

индекс массива j выходит из границы, так как вы постоянно приращение значения j при проверке i < copy[i].length. Поскольку это значение остается истинным, j увеличивается до числа, которое является индексом из строки для массива copy[i][j].

Смежные вопросы