【问题标题】:IndexOutofBounds Exception when finding a peak in 2d arrays在二维数组中找到峰值时出现 IndexOutofBounds 异常
【发布时间】:2020-07-17 10:23:23
【问题描述】:

我已经清楚地定义了所有限制,但我一直在获取索引超出范围的异常。任何人都可以看看并告诉我我可能错在哪里。我试图在二维数组中找到多个峰值。谢谢。

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

【问题讨论】:

  • 在最后一次迭代中,a+1 将超出范围。上一次迭代中的示例 row=4 a 将为 3,因此 3+1 为 4,这是超出范围的,因为数组从 0 开始。b 也是如此
  • @bakero98 但我已经为最后一行迭代定义了 n 。如果 a 或 b == n 则提供其他说明

标签: java multidimensional-array data-structures indexoutofboundsexception


【解决方案1】:

看起来第三到第七个ifs 应该是else ifs。考虑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");
  }
}

【讨论】:

    猜你喜欢
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2013-05-25
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多