4

これは宿題の問題のように聞こえるかもしれませんが、そうではないことを誓います。

この 2D 配列ラッパー クラスの反復子を作成しようとしています。この問題を解決できれば、イテレータを構築できると考えました。

0 から始まり 8 で終わる 9 つの連続した整数のこの 1D 配列があります。

[0, 1, 2, 3, 4, 5, 6, 7, 8]

2 つの変数が与えられhorizontal_size = 3vertical_size = 3

horizontal_sizeこの配列をbyである 2D 配列にしたいと考えていvertical_sizeます。簡潔にするために、それらhを呼び出しましょう。v

私が生成したい結果はこれです:

0 1 2
3 4 5
6 7 8

インデックスを示す 1D 配列の値を指定するhと、 と も指定vされます。この場合、どちらも 3 です。2D 配列でインデックスを生成する方法はありますか?

たとえば、1D 配列の最初の要素は 0 で、これは にマップされarray[0][0]ます。2 番目の要素は 1 で、これはarray[0][1]

を実行することで垂直方向のインデックスを取得できることがわかりましたarray1d[i] mod vertical_size

           for getting the vertical index ::: th 

0 = [0][0] 0 mod 3 = 0 1 = [0][1] 1 mod 3 = 1 2 = [0][2] 2 mod 3 = 2

3 = [1][0] など... 4 = [1][1] 5 = [1][2]

6 = [2][0] 7 = [2][1] 8 = [2][2]

しかし、水平インデックスを取得する方法がわかりません。

4

3 に答える 3

7

水平方向のインデックスはfloor(i / v)、またはi/vプログラミング言語が切り捨てによる整数除算を実装しているかのように与えられます。

たとえば、floor(7/3) = 2 なので、7 は行 2 にあります。

于 2013-10-11T14:08:28.843 に答える
6

これは Java で動作するソリューションです。%関数であることに注意してくださいmod

public static void main(String[] args) throws IOException {
    int[] oneD = {1,2,3,4,5,6};
    int w = 3;
    int h = 2;
    int[][] twoD = new int[h][w];
    int[] oneDReversed = new int[oneD.length];

    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            twoD[i][j] = oneD[i*w+j];
        }
    }

    for (int i = 0; i < w*h; i++) {
        oneDReversed[i] = twoD[(i / w)][(i%w)];
    }
}

なぜtwoD[i][j] = oneD[i*w+j]ですか?サイクル内にサイクルがあるため、「すべての行に対してすべての列をi選択し、等式jでそれを与えますarray[num_of_rows][num_of_columns]: row*width+ column.

予約済みの意味:rowは切り捨てられたデバイスとしてカウントされindexますnumber_of_columns。そして、column同じ変数(mod)を分割する残りの部分です。

于 2013-10-11T14:13:40.223 に答える