访问Java

时间:2018-03-11 22:24:20

标签: java arrays

假设我们有一个名为grid的8 x 8 2d整数数组,并试图在[5] [5]

中选择元素0
int[][] 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,直到它到达目标元素。

1 个答案:

答案 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?