9

我有一个 ' ' 形式的数组,int[][]它代表一个小网格的坐标。每个坐标都被分配了自己的值。例如array[0][4] = 28……

我有两个问题。首先,我如何遍历所有存储的值。其次,我希望能够输入一个值并返回其在网格中的特定坐标。解决这个问题的最佳方法是什么?

感谢您的任何帮助!

4

7 回答 7

28

您可以使用 for 循环或增强的 for 循环进行迭代:

for (int row=0; row < grid.length; row++)
{
    for (int col=0; col < grid[row].length; col++)
    {
        int value = grid[row][col];
        // Do stuff
    }
}

或者

// Note the different use of "row" as a variable name! This
// is the *whole* row, not the row *number*.
for (int[] row : grid)
{
    for (int value : row)
    {
         // Do stuff
    }
}

第一个版本将是“查找坐标”问题的最简单解决方案 - 只需检查内部循环中的值是否正确。

于 2009-01-23T20:54:12.300 回答
4

迭代值使用循环:

 int[][] matrix   
 //...
 for(int row[] : matrix)
     for(int cell : row){
      //do something with cell
    }

要根据值访问坐标,您需要某种双哈希图(查看 java.util.HashMap),但我不知道直接这样做

于 2009-01-23T20:52:39.260 回答
2

要遍历网格中的所有元素,请尝试以下操作:

int grid[][] = new int[10][10];

for(int i = 0; i < grid.length(); ++i) {
    for(int j = 0; j < grid[i].length(); ++j) {
        // Do whatever with grid[i][j] here
    }
}
于 2009-01-23T20:53:06.250 回答
1

除非您的网格以某种方式排序,否则您可能不会比蛮力搜索做得更好。

对于迭代,我认为它会是这样的(语法可能有点偏离,我有一段时间没有处理 java 中的数组了。):

int[][] grid;  // just assuming this is already assigned somewhere

for(int x = 0 ; x < grid.length ; x++) {
  int[] row = grid[x];
  for(int y = 0 ; y < row.length ; y++) {
    int value = row[y];
    // Here you have the value for grid[x][y] and can do what you need to with it
  }
}

对于搜索,您可能需要使用它进行迭代,然后在找到它后返回。

如果您可能多次查找相同值的位置,那么您可能希望使用哈希表来记忆结果。

于 2009-01-23T20:52:46.937 回答
0

使用嵌套的 for 循环遍历 x 和 y 维度,这样您就可以遍历每个值,一次一个。

要输入一个值,只需执行与上述相同的操作,但要查找与您请求的值匹配的值。

于 2009-01-23T20:53:31.973 回答
0

如果您在单个类中阻止所有这些集合并且不以任何方式公开它们,您会很高兴。

这意味着将您的搜索和查找例程也移动到此类中。

对于存储,每个人都涵盖了迭代、添加哈希表和查找。我在 nickolai 的帖子上发表了这条评论:

将 new Integer(ix + iy * 1000) 存储为哈希表中的值。如果您的 y 索引可以超过 1000,请使用更大的数字——整数真的很大。要取回它,请使用 ix=val%1000, iy=val/1000。

如果您的数组和哈希表封装在同一个类中,那么您的其余代码将非常容易编写并且更加简洁。

于 2009-01-23T21:32:01.053 回答
-1

通常没有办法找到特定值的特定坐标,除非通过数组并搜索它。但是,如果保证数组中的值是唯一的(即每个值只出现在一个单元格中),您可以维护一个单独的数组作为索引,它存储由该值索引的每个值的坐标。

于 2009-01-23T20:53:27.730 回答