Java 2D数组错误

时间:2012-10-28 22:12:33

标签: java

因此,我需要对每个元素进行2D数组计算并将其传输到另一个2D数组中,同时使用当前元素的“向左”,“向右”,“向上”和“向下”的值。如果当前元素在边缘(x = 0,y = 0,x = array.length,y = array.length),我将得到一个超出边界的数组错误。我想创建一个for循环来处理每个案例,但我不知道该怎么做。我的代码示例是

private void buildE(int[][] array, int y, int x)
{

    int up = array[y - 1][x];
    int down = array[y + 1][x];
    int left = array[y][x - 1];
    int right = array[y][x + 1];

    if(up == 0){

        buildETopRow(array);

    }

E将是我的新阵列。此方法不起作用,因为y不等于0,它只是不存在但我不能将int设置为null。在出界超出错误的情况下,我需要超出边界的元素(向上,向下,向左或向右)等于当前元素。有没有办法我仍然可以使用for循环,还是需要做其他事情?

3 个答案:

答案 0 :(得分:1)

如果我正确读到这个,你想要有效地处理边缘元素与边缘元素之差为0的差异。如果这是真的我会写四个方法right(),left(), up()和down(),下面以down()为例:

 /*
  * Return the difference between an element an the element below it
  */

public void down(int x, int y) {

    if (y == array.length - 1) { 
       \\ on the bottom edge
       return 0;
    }   

    return array[y][x] - array[y + 1][x];

}

在你的循环中,你要计算:

up(x,y) + down(x,y) + right(x,y) + left(x,y)

或者你需要总结的任何计算。

答案 1 :(得分:0)

使用边框区域围绕阵列的最简单方法。因此,x尺寸确实是width+2

import java.util.*;
import java.lang.*;

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        int realWidth = 10;
        int realHeight = 10;
        int[][] in = new int[(realWidth+2)][(realHeight+2)];
        int[][] out = new int[(realWidth+2)][(realHeight+2)];
        for (int j = 1;j<realHeight+1;j++)
        {
            for (int i = 1;i<realWidth+1;i++)
            {
                int top = in[j-1][i];
                int bottom = in[j+1][i];
                int left= in[j][i-1];
                int right  = in[j][i+1];
                out[j][i] = operation(top,bottom,left,right);
            }
        }
    }
    public static int operation (int top,int bottom,int left,int right)
    {
        return top+bottom+left+right;
    }
}

答案 2 :(得分:0)

我不完全确定你的问题是什么,但是(1)遍历2D数组的通常结构是使用嵌套for循环(一个在另一个内部),以及(2)当你想要环绕计数器时(例如2,3,0,1,2 ......)使用余数运算符%

int numRows = theArray.length;
int numCols = theArray[0].length;

for (int i = 0; i < numRows; i++) {
    for (int j = 0; j < numCols; j++) {

        int right = theArray[(j+1) % numCols];
        int down = theArray[(i+1) % numRows];
        int left = theArray[(j+numCols-1) % numCols];
        int up = theArray[(i+numRows-1) % numCols];

        /* right, down, left, and up will be the elements to the right, down, 
           left, and up of the current element. Npw that you have them, you can 
           process them however you like and put them in the other array. */

    }
}

余数运算符A%B的作用是,一旦它变为B,就将A设置为零。由于B是数组的大小,这恰好是它太大并且会导致IndexOutOfBounds错误。注意:这不是% 的工作方式,但这是一种考虑它的作用的好方法。要了解有关它的更多信息,您可以谷歌搜索,我找到了一个正确的解释here