4

这听起来像是一个家庭作业问题,但我发誓不是。

我正在尝试为这个二维数组包装类构建一个迭代器。我想如果我能够解决这个问题,那么我可以构建我的迭代器。

我有这个从 0 开始到 8 结束的 9 个连续整数的一维数组。

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

我有两个变量horizontal_size = 3vertical_size = 3

我想把这个数组变成一个二维数组,即horizontal_size. 为了简洁起见,vertical_size让我们称呼他们。hv

我想要生成的结果是这样的:

0 1 2
3 4 5
6 7 8

给定一维数组中的值,它告诉我索引,也给定hv,在这种情况下都是 3。有没有办法在二维数组上生成索引?

例如,一维数组中的第一个元素是 0,它映射到array[0][0]. 第二个元素是 1,它映射到array[0][1]

我发现我可以通过array1d[i] mod vertical_size.

           for getting the vertical index ::: th 

0 = [0][0] 0 模 3 = 0 1 = [0][1] 1 模 3 = 1 2 = [0][2] 2 模 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所有列jarray[num_of_rows][num_of_columns]通过均衡将其提供给 : row*width+ column

保留的意思是:row算作四舍五入的indexdevide number_of_columns。这column是划分相同变量(mod)的其余部分。

于 2013-10-11T14:13:40.223 回答
0

这是我在 C# 中所做的,我想说它是在 1D 和 2D 数组之间转换的最简单和最高效的方法,它不需要在循环中进行任何数学运算,如果你有包含数百万个项目的数组(比如读取和写入图像)

C#代码:

// Creates a 2D array from a 1D array
public static int[,] Array1Dto2D(int[] array1D, int width, int height)
{
    int[,] array2D = new int[width, height];
    int i = 0;
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            array2D[x, y] = array1D[i];
            i++;
        }
    }
    return array2D;
}

// Creates a 1D array from a 2D array
public static int[] Array2Dto1D(int[,] array2D)
{
    int width = array2D.GetLength(0);
    int height = array2D.GetLength(1);
    int[] array1D = new int[width * height];
    int i = 0;
    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            array1D[i] = array2D[x, y];
            i++;
        }
    }
    return array1D;
}
于 2019-09-15T02:30:22.653 回答