0

したがって、現在の要素の「左」「右」「上」「下」の値を使用しながら、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 ループを引き続き使用できる方法はありますか、それとも何か他のことをする必要がありますか?

4

3 に答える 3

1

私がこれを正しく読んだ場合、端にある要素と端にない要素の違いを 0 として効果的に扱いたいと思うでしょう。それが本当なら、right()、left()、up()、down() の 4 つのメソッドを記述します。 、例として以下に 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)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が行うことは、A が B と同じ大きさになると、A をゼロに戻すことです。B は配列のサイズであるため、それはまさに配列が大きすぎる場合であり、IndexOutOfBounds エラーが発生します。注: それはどのように% 機能するかではありませんが、それが何をするかを考えるには問題ありません。詳細については、Google で検索してください。ここで適切な説明が見つかりました。

于 2012-10-28T22:32:19.563 に答える