Java int[][]数组 - 迭代和查找值

10

我有一个数组,类型为'int[][]',表示一个小网格的坐标。每个坐标都被分配了自己的值,例如array[0][4] = 28......

我有两个问题。首先,如何迭代遍历存储的所有值。其次,我想输入一个值并返回它在网格中对应的特定坐标。最好的方法是什么?

谢谢任何帮助!


如果这是作业,你应该明确说明(除了使用作业标签之外)。 - James Van Huis
7个回答

31

你可以使用普通的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
    }
}

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


+1 的完整性,但我会将“i”和“j”重命名为“row”和“col”。 请注意,这是英语到简体中文的翻译。 - Tim Frey
1
但是Outlaw,如果他这样做,他就不会向Fortran致敬了。 - Paul Tomblin
1
@Paul:不,Fortran是在向这个答案的第一个版本致敬。它可能不知道,但这肯定是真的。 - Jon Skeet
@Outlaw...除非你的解释是map[row][column]或map[column][row],否则哪个维度是行、哪个维度是列完全取决于你的解释。然而,i、j、k、l、m...总是silly_array[i][j][k][l][m]......我想这就是Jon要表达的意思。 - Aaron Maenpaa
我同意,但至少给它们贴上一个标签会建立某种约定。如果约定是行 -> 单元格,那么很容易发现任何将事物搞反的代码。 - Tim Frey

5

使用循环来迭代值:

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

要根据值访问坐标,您需要某种双哈希映射(查看java.util.HashMap),但是我不知道有什么方法可以直接实现这样的映射。


你可以使用普通的哈希映射来实现。你只需要定义一个对象作为键,其中包含两个坐标即可。 - Herms
@Herms:他想通过数值来查找坐标,因此关键字必须是单元格的值。如果多个单元格可以具有相同的值,则情况会变得更加复杂,但仍然可以实现。 - user54579
我认为在这里使用另一个数据结构可能不是一个好主意。保持它们同步可能会很困难。尽管速度会变慢,但最好还是搜索整个表。 - Tim Frey
将新的整数(ix + iy * 1000)存储为哈希表中的值。如果您的y索引可能超过1000,请使用更大的数字 - 整数非常大。要获取它,请使用ix = val%1000,iy = val/1000。 - Bill K

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
    }
}

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
  }
}

如果你需要搜索,可能需要使用迭代来查找,然后在找到后返回。

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


0
使用嵌套的for循环遍历x和y维度,以便逐个值进行处理。
对于输入一个值,只需像上面一样进行操作,但要查找所请求的值的匹配项。

0

如果您将所有这些集合都封装在一个类中,并且不以任何方式公开它们,那么您会感到最幸福。

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

对于存储,每个人都可以使用迭代、哈希表和查找。我在Nickolai的帖子上放了这个评论:

将新的Integer(ix + iy * 1000)作为哈希表中的值进行存储。如果您的y索引可以超过1000,请使用更大的数字--int非常大。要获取它,请使用ix=val%1000,iy=val/1000。

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


-1
通常情况下,除非遍历数组并搜索它,否则无法找到特定值的具体坐标。但是,如果保证数组中的值是唯一的(即每个值仅出现在一个单元格中),则可以维护一个单独的数组作为索引,该数组存储由值索引的每个值的坐标。

误导性的,使用哈希表可以轻松解决。 - Bill K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接