假设我们有一个名为grid的8 x 8 2d整数数组,并试图在[5] [5]
中选择元素0int[][] grid = new int{{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,0,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1}};
现在的问题是,是否可以在不使用坐标的情况下访问元素0的索引,只使用一个数字?
示例:使用数字45访问元素0,如1d数组
我尝试用for循环解决这个问题,但它让我超出了范围错误。
int x = 0;
int y = 0;
for (int i = 0;i<45;i++) {
x += 1;
if (x > grid[y].length) {
x = 0;
y += 1;
}
上面的代码应该添加x和y,直到它到达目标元素。
答案 0 :(得分:1)
最终你必须使用这两个索引。
您可以只给出一个数字来计算x和y。
public static int getAt(int[][] matrix, int position) {
int columns = matrix[0].length; // column size, matrix has to be at least 1x1
return matrix[position / columns][position % columns];
}
public static void setAt(int[][] matrix, int position, int value) {
int columns = matrix[0].length; // column size, matrix has to be at least 1x1
matrix[position / columns][position % columns] = value;
}
同样在你的例子中:
1)您不需要使用for循环(并最终访问或修改矩阵,您必须使用这两个索引)。
2)当y大于或等于行大小(在这种情况下为8)时,您将收到一个越界异常,因为您只有8列。
最后,使用一个索引访问它的唯一方法是将矩阵转换为1d数组。
在这里你可以看到: how to convert 2d array into 1d?