0

所以我需要一个二维数组对每个元素进行计算并将其转移到另一个二维数组中,同时使用当前元素的“左”“右”“上”和“下”的值。如果当前元素在边缘 (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,它只是不存在,但我也不能将 ints 设置为 null。在出现越界错误的情况下,我需要越界的元素(上、下、左或右)等于当前元素。有没有办法我仍然可以为此使用 for 循环,还是我需要做其他事情?

4

3 回答 3

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)

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

于 2012-10-28T22:31:00.360 回答
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;
    }
}
于 2012-10-28T22:24:33.963 回答
0

我不完全确定你的问题是什么,但是(1)遍历二维数组的常用结构是使用嵌套的 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作用是在 A 变得与 B 一样大时将其设置回零。由于 B 是数组的大小,因此恰好是它太大并且会导致 IndexOutOfBounds 错误。注意:这不是如何% 工作的,但它是一种很好的方式来思考它的作用。要了解更多关于它的信息,你可以谷歌它,我在这里找到了一个好的解释。

于 2012-10-28T22:32:19.563 回答