这听起来像是一个家庭作业问题,但我发誓不是。
我正在尝试为这个2D数组包装类构建一个迭代器。我想如果我能够解决这个问题,那么我可以构建我的迭代器。
我有一个9个连续整数的1D数组,从0开始到8结束。
[0, 1, 2, 3, 4, 5, 6, 7, 8]
我有两个变量horizontal_size = 3
和vertical_size = 3
我想将此数组转换为horizontal_size
vertical_size
的{{1}}二维数组。为简洁起见,我们称他们为h
和v
。
我想要生成的结果是:
0 1 2
3 4 5
6 7 8
给出1D数组中的值,它告诉我索引,同样给出h
和v
,在这种情况下都是3。有没有办法在2D数组上生成索引?
例如,1D数组中的第一个元素为0,映射到array[0][0]
。第二个元素是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]
但我不确定如何获得水平索引。
答案 0 :(得分:7)
如果您的编程语言通过截断实现整数除法,则水平索引由floor(i / v)
给出,或者仅为i/v
。
例如,floor(7/3)= 2,因此7位于第2行。
答案 1 :(得分:5)
这是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
devide number_of_columns
。而column
是其余的相同变量(mod)。
答案 2 :(得分: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;
}