【问题标题】:Access a 2d array index without coordinates in Java在Java中访问没有坐标的二维数组索引
【发布时间】:2018-03-11 22:24:20
【问题描述】:

假设我们有一个名为 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,如一维数组

我尝试使用 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 直到它到达目标元素。

【问题讨论】:

  • 应该是if (x == grid[y].length)

标签: java arrays


【解决方案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 列。

最后,使用一个索引访问它的唯一方法是将矩阵转换为一维数组。

在这里您可以看到: how to convert 2d array into 1d?

【讨论】:

  • 你能不能把一维数组再转回二维数组
  • 是的,但这没有多大意义。有要求吗。。在这里你可以看到如何:stackoverflow.com/questions/2706529/…
  • 我会尝试每个解决方案,看看哪个最有效
  • 使用模数方法计算位置对我来说是最有效的解决方案
  • 很好,如果只使用一个索引不是绝对要求,那么使用 mod div 会更容易。
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2013-03-16
  • 2011-01-26
  • 1970-01-01
  • 2013-12-14
  • 2022-12-12
相关资源
最近更新 更多