IndexOutofBounds Исключение при поиске пика в 2d массивах - PullRequest
1 голос
/ 05 апреля 2020

Я четко определил все ограничения, но продолжаю выводить исключение за пределами индекса. Может кто-нибудь взглянуть и сказать, где я могу ошибаться. Я пытаюсь найти несколько пиков в 2d массиве. Спасибо.

Scanner o = new Scanner(System.in);

    System.out.println("Enter length of array: ");
    int row = o.nextInt();
    System.out.println("A 2d array of " + row + "x" + row + " has been generated");

    int[][] table = new int[row][row];


    for (int i = 0; i < row; i++){
        for (int j = 0; j < row; j++){
            table[i][j] = (int)(Math.random() * 100);
        }
    }

    for (int i = 0; i < row; i++){
        for (int j = 0; j < row; j++){
            System.out.print(table[i][j] + "\t");
        }
        System.out.println("");
    }
    int n = row - 1;
    for (int a = 0; a < row; a++){
        for (int b = 0; b < row; b++){
            if (a == 0 &&  b == 0 && table[a][b] > table[a+1][b] && table[a][b] > table[a][b+1]){
                System.out.println(table[a][b] + " is a peak");
            }
            else if (a == 0 && table[a][b] > table[a][b-1] && table[a][b] > table[a+1][b] && table[a][b] > table[a][b+1]){
                System.out.println(table[a][b] + " is a peak");
            }
            if (b == 0 && table[a][b] > table[a-1][b] && table[a][b] > table[a+1][b] && table[a][b] > table[a][b+1]){
                System.out.println(table[a][b] + " is a peak");
            }
            if (table[a][b] > table[a][b-1] && table[a][b] > table[a-1][b] && table[a][b] > table[a][b+1] && table[a][b] > table[a+1][b]){
                System.out.println(table[a][b] + " is a peak");
            }
            if (a == n && b == n && table[a][b] > table[a-1][b] && table[a][b] > table[a][b-1]){
                System.out.println(table[a][b] + " is a peak");
            }
            if (a == n && table[a][b] > table[a][b+1] && table[a][b] > table[a-1][b] && table[a][b] > table[a][b-1]){
                System.out.println(table[a][b] + " is a peak");
            }
            if (b == n && table[a][b] > table[a+1][b] && table[a][b] > table[a-1][b] && table[a][b] > table[a][b-1]){
                System.out.println(table[a][b] + " is a peak");
            }
        }

1 Ответ

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

Похоже, что с третьего по седьмой if с должно быть else if с. Рассмотрим случай a=b=0: первый if выполняется, второй пропускается, но третий выполняется снова и выдает ошибку, поскольку a-1 не является допустимой строкой. В качестве примечания, это также может напечатать сообщение несколько раз для данного элемента.

Если ваша цель - найти элементы, которые строго больше, чем их (до) четырех соседей, могу я предложить заполнить матрицу с очень большими значениями? Это избавит от всех проверок и значительно сократит код. Что-то вроде:

int[][] table = new int[row + 2][row + 2];

for (int i = 0; i < row + 2; i++) {
  table[0][i] = table[row + 1][i] = 100;
  table[i][0] = table[i][row + 1] = 100;
}

for (int i = 1; i <= row; i++) {
  for (int j = 1; j <= row; j++) {
    table[i][j] = (int)(Math.random() * 100);
  }
}

// ... print the matrix (skipped for brevity) ...

for (int i = 1; i <= row; i++) {
  for (int j = 1; j <= row; j++) {
    if (table[i][j] > table[i][j - 1] &&
        table[i][j] > table[i - 1][j] &&
        table[i][j] > table[i][j + 1] &&
        table[i][j] > table[i + 1][j]) {
      System.out.println(table[i][j] + " is a peak");
  }
}
...