【问题标题】:Finding adjacent matrix: Java.lang.ArrayIndexOutOfBoundsException查找相邻矩阵:Java.lang.ArrayIndexOutOfBoundsException
【发布时间】:2021-05-17 05:50:13
【问题描述】:

我正在尝试查找矩阵中的所有相邻元素。相邻是指水平、垂直和对角线元素彼此相邻的元素。但是它给了我java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5。我不知道为什么,任何帮助将不胜感激!程序也需要递归!

class matrixAdjacent
{
   public static void main(String[] args) 
   {
      char grid[][] = {{'0','0','0','1','1','0','1','1','0','0','0','1','1','1','0','1','1','1','0','1'},
                      {'1','0','0','0','0','1','0','0','0','1','0','0','0','0','0','1','1','1','1','1'},
                      {'0','1','0','0','1','0','0','0','1','0','1','0','0','0','0','0','0','1','1','1'},
                      {'1','1','1','0','0','1','0','1','0','0','0','0','1','0','1','1','0','1','1','0'},
                      {'0','1','1','1','0','1','1','1','0','1','0','0','1','0','1','0','1','1','0','1'}};
      
      ExploreAndLabelColony(grid, 0, 0);
   }


private static void ExploreAndLabelColony(char[][] grid, int i, int j) 
{
    // TODO Auto-generated method stub
    if(grid==null)
    {
        return;
    }
    if(i==grid.length || j==grid[0].length) 
    {
        return;
    }  
    
    if (grid[i][j] == '1') //checks if theres a 1 which refers to a colony      
    {
      if (i>0 && i + 1 < grid.length && j>0 && j + 1 < grid[0].length) 
      {
         if (grid[i+1]==grid[j] || grid[i] == grid[j+1] || grid[i-1]==grid[j] || grid[i]==grid[j-1]) //checks if adjacent
         {
           grid[i][j] = 'A'; //creates a colony
         }
      }
    }
    else if(grid[i][j] == '0') //replaces 0 with '-'
    {
      grid[i][j] = '-';  
    }
    
    System.out.print(grid[i][j]); //print grid
    if(j==grid[0].length-1)
    {
      System.out.println();      //prints next row
      ExploreAndLabelColony(grid,i+1,0); //recurse to increment row 
    }     
    ExploreAndLabelColony(grid,i,j+1); //recurse to increment column
      
    }
}

【问题讨论】:

    标签: java arrays recursion matrix indexoutofboundsexception


    【解决方案1】:

    问题

          if (i>0 && i + 1 < grid.length && j>0 && j + 1 < grid[0].length) 
          {
             if (grid[i+1]==grid[j] || grid[i] == grid[j+1] || grid[i-1]==grid[j] || grid[i]==grid[j-1]) //checks if adjacent
             {
               grid[i][j] = 'A'; //creates a colony
             }
          }
    

    在上面这段代码中,j&gt;0 &amp;&amp; j + 1 &lt; grid[0].length不能保证对grid[j]的访问。

    对内部数组索引的检查无法正确验证对外部数组索引的访问。

    检查相邻元素

    要检查相邻元素,必须检查所有 4 个有效的相邻索引

    1. grid[i][j - 1]
    2. grid[i][j + 1]
    3. grid[i - 1][j]
    4. grid[i + 1][j]

    在上述 4 项检查中,请在进行 i - 1i + 1j - 1j + 1 访问之前验证索引。

    【讨论】:

    • 我该如何解决这个问题?我试图在同一行设置条件,但它仍然给我错误
    • @some_cs_student,用可能的索引更新了答案。您可以使用代码调试器进行调试。如果你没有使用任何调试器,你可以试试 intellij 社区版。
    【解决方案2】:

    对于坐标为ij的给定单元格,相邻元素位于正方形中:

    [i - 1][j - 1], [i - 1][j], [i - 1][j + 1]
    [i    ][j - 1],  CURR_CELL, [i    ][j + 1]
    [i + 1][j - 1], [i + 1][j], [i + 1][j + 1]
    

    可以使用Math.minMath.max 函数应用其他限制,并且可以按如下方式检测相邻单元格:

    if (grid[i][j] == '1') {  //checks if theres a 1 which refers to a colony
        out: // label to break
        for (int ii = Math.max(i - 1, 0), in = Math.min(grid.length, i + 2); ii < in; ii++) {
            for (int jj = Math.max(j - 1, 0), jn = Math.min(grid[0].length, j + 2); jj < jn; jj++) {
                if (ii == i && jj == j) {
                    continue; // skip reference cell
                }
                if (grid[ii][jj] == '1') {
                    grid[i][j] = 'A';
                    break out; // as soon as the first neighbor is found
                }
            }
        }
    }
    

    通过此更改,给定输入的输出:

    public static void main(String[] args) {
        char grid[][] = {
            {'0','0','0','1','1','0','1','1','0','0','0','1','1','1','0','1','1','1','0','1'},
            {'1','0','0','0','0','1','0','0','0','1','0','0','0','0','0','1','1','1','1','1'},
            {'0','1','0','0','1','0','0','0','1','0','1','0','0','0','0','0','0','1','1','1'},
            {'1','1','1','0','0','1','0','1','0','0','0','0','1','0','1','1','0','1','1','0'},
            {'0','1','1','1','0','1','1','1','0','1','0','0','1','0','1','0','1','1','0','1'}
        };
          
        ExploreAndLabelColony(grid, 0, 0);
    }
    

    如下:

    ---AA-A1---AA1-AAA-A
    A----A---A-----AAAAA
    -A--A---A-1------AAA
    AAA--A-A----A-AA-AA-
    -AA1-AA1-1--1-1-A1-1
    

    可能,应修复条件以检查相邻单元格是否已包含A,或者是否有太多邻居但设置/应用这些或任何其他规则取决于作者。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多