有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是检查索引越界的有效方法

我有一个n x n 2D数组,需要将随机点连接到四个相邻点(抱歉,我添加了图片,但似乎必须单击链接才能显示图像)

Click to see the image

我希望使用如下代码:

connect(p, p - n);
connect(p, p + n);
connect(p, p - 1);
connect(p, p + 1);

我现在遇到的问题是边缘上的索引超出了边界。最初我创建了大小为(n+2)*(n+2)的数组来解决这个问题。这保留了代码的简单性,但是我没有满足分配的存储要求。数组必须是n*n

我研究并修改了我的算法

connect(grid[i][j], grid[Math.max(0, i-1)][j]);
connect(grid[i][j], grid[Math.min(n - 1, i+1)][j]);
connect(grid[i][j], grid[i][Math.max(0, j-1)]);
connect(grid[i][j], grid[i][Math.min(n - 1, j+1)]);

现在,它会将点连接到自身,这是不允许的。我的问题是——是否有更好/更干净的方法来检查指数是否超出范围?谢谢大家


共 (3) 个答案

  1. # 1 楼答案

    包装连接方法

    // p1 is valid, check p2
    xxx  connectWrapper(xxx p1, xxx p2, int n){
        // check first
        if(p2.x < 0 || p2.y < 0 || p2.x > n || p2.y > n) return;
        connect(p1, p2);
    }
    

    因此,您可以像往常一样使用这个connectWrapper来替换connect方法

  2. # 2 楼答案

    你总是可以在邻居之间兜圈子。我经常这样做:

    for (int ni=0; ni<4; ++ni) {
        // starting at (x,y-1), bit 0 of ni means go SE, and bit 1 means go SW
        int nx = x + (ni&1) - (ni>>1);
        int ny = y - 1 + (ni&1) + (ni>>1);
        if (nx >= 0 && ny >= 0 && nx < width && ny < height) {
            connect(x,y,nx,ny);
        }
    }
    

    当我对按特定顺序浏览邻居很挑剔时:

    for (int dir=0x12011021; dir!=0; dir>>=8) {
        int nx = x - 1 + ((dir>>4)&3);
        int ny = y - 1 + (dir&3);
        if (nx >= 0 && ny >= 0 && nx < width && ny < height) {
            connect(x,y,nx,ny);
        }
    }
    
  3. # 3 楼答案

    我个人认为:

    connect(grid, i, j, i - 1, j);
    

    让{}做这件事:

    void connect(Point[][] grid, int x1, int y1, int x2, int y2) {
      if (x2 < 0 || y2 < 0  || 
          x2 >= grid.length || y2 >= grid.length) { // see note
        return; // nothing to do out of bounds
      }
      connect(grid[x1][y1], grid[x2][y2]);  
    }
    

    它完全假设网格是一个N*N的矩阵

    您也可以不关心检查:

    void connect(Point[][] grid, int x1, int y1, int x2, int y2) {
      try {
        connect(grid[x1][y1], grid[x2][y2]);  
      } catch (ArrayIndexOutOfBoundException e) {
        // nasty
      }
    }
    

    我确实认为这很糟糕,因为抓捕往往比检查花费更多——即使检查两次