java 2d数组比较UPDATED

时间:2016-04-21 02:53:17

标签: java arrays

(修订版) 我无法弄清楚在这里要做什么,我需要比较一个二维数组来查看是否有任何数字匹配。我需要四个数字来匹配上/下,左/右或对角线。我只是不能让它测试向下/向左对角线(/)这里是我的更新代码

public static boolean isAdjacentFour( int[][] a ) {
    // Code to test if column has four adjacent numbers
    for ( int row = 0; row <= a.length - 3 ; row++) {
        for (int col = 0; col <= a[0].length - 1 ; col++) {
            if (a[row][col] == a[row+1][col] && a[row+2][col] == a[row][col]
                    && a[row+3][col] == a[row][col]) {
                return true;
            } 
        }
    }
    // Code to test if row has four adjacent numbers
    for ( int row = 0; row <= a.length - 1 ; row++) {
        for (int col = 0; col <= a[0].length - 3 ; col++) {
            if (a[row][col] == a[row][col+1] && a[row][col] == a[row][col+2]
                    && a[row][col] == a[row][col+3]) {
                return true;
            }
        }
    }
        // Code to test if there are 4 adjacent numbers in a down/right ( \ )diagonal
        for ( int row = 0; row <= a.length - 3 ; row++) {
            for (int col = 0; col <= a[0].length - 3 ; col++) {
                if (a[row][col] == a[row+1][col+1] && a[row][col] == a[row+2][col+2]
                        && a[row][col] == a[row+3][col+3] ) {
                    return true;
                }
            }
        }
        for ( int row = 0; row <= a.length - 3 ; row++) {
            for (int col = 0; col <= a[0].length + 3 ; col--) {
                if (a[row][col] == a[row+1][col-1] && a[row][col] == a[row+2][col-2]
                        && a[row][col] == a[row+3][col-3] ) {
                    return true;
                }
            }
        }

    return false;
}

2 个答案:

答案 0 :(得分:1)

根据经验,总是放置调试点以查看异常/错误的原因。

这里的问题是你的外部循环从0到第1行。但是在内循环中你使用[row + 2]和[row + 3]和[row + 1]。现在,当外部循环进入第2行迭代时,您将获得一个超出范围的异常。

可以在这里发布代码,但如果您理解这一点,您应该能够解决它。

(编辑):评论中提出的例子。

假设您有一个大小为10X10的2D数组A [] []。 现在,如果当前循环是A [4] [4]或(A [row] [col]): 左元素:A [4] [3]或(A [row] [col-1])//这里我们在同一行但是(列-1),因为我们想要左元素。 右上角元素:A [3] [5]或((A [row-1] [col + 1])//这里我们要(4-1)行,因为我们对上面的行感兴趣和(4 +1)列,因为我们想要正确的元素。 左下角:A [5] [3](A [row + 1] [col-1])...

现在两个连续的左下角元素将是(A [row + 1] [col-1])和(A [row + 2] [col-2])。

尝试通过绘制2D数组并根据A [i] [j]命名每个单元来对其进行可视化。

答案 1 :(得分:1)

我在第一个嵌套for循环中注意到的一个问题是这行代码,

for ( int row = 0; row <= a.length - 3 ; row++) 

现在你的方式,行变量将随着外部for循环的每次迭代而递增。但是,根据您执行程序的方式,条件应为row <= a.length - 4,这就是原因。假设您有一个四乘四的2D阵列。嵌套的for循环将经历内循环的一次正常迭代,实际上检查每一列是否有列中四个连续匹配数的可能匹配。这是从外部for循环和row = 0开始实际运行程序时的样子,

迭代内部for循环之一:

if (a[0][0] == a[1][0] && a[2][0] == a[0][0] && a[3][0] == a[0][0])

迭代内部for循环中的两个:

if (a[0][1] == a[1][1] && a[2][1] == a[0][1] && a[3][1] == a[0][1])

迭代内部for循环中的三个:

if (a[0][2] == a[1][2] && a[2][2] == a[0][2] && a[3][2] == a[0][2])

内部for循环的最后迭代:

if (a[0][0] == a[1][3] && a[2][3] == a[0][3] && a[3][0] == a[0][3])

完成此操作后,行变量将根据外部循环定义递增。这是最有可能导致错误的原因,因为现在当我们开始使用row = 1迭代内部循环时,会发生这种情况

迭代内部for循环之一:

if (a[1][0] == a[2][0] && a[3][0] == a[1][0] && a[4][0] == a[1][0])

这里,我们在尝试访问4x4 2D数组中的第5行时已经有了indexoutofboundsexception。所以这里简单的解决方法是改变

for(int row = 0; row <= a.length - 3 ; row++)

for(int row = 0; row <= a.length - 4 ; row++)`

可以为第二个嵌套for循环创建类似的参数。如果你不相信我,做一些类似于我对行所做的事情,并使用4x4 2D数组为它写出迭代。您将在外部for循环的第一次迭代中获取arrayindexoutofbounds异常,并在row = 0和col = 1时在内部for循环的第二次迭代中获取,导致程序在第五列中检查2D数组的第一行。所以简单的修复应该是改变

for (int col = 0; col <= a[0].length - 3 ; col++)

for (int col = 0; col <= a[row].length - 4 ; col++)

就个人而言,我更喜欢使用[row] .length,因为可能会出现一些不完美的nxn 2D数组的情况。例如,某些行可能只有3列,其中第一行有7列。如果是这种情况,那么您将尝试访问第一行中不存在于其他行中的列的异常异常。

对于第三个嵌套的for循环,同样可以通过写出迭代来生成相同的参数,它应该更改为

for(int row = 0; row <= a.length - 4 ; row++) {
      for(int col = 0; col <= a[row].length - 4 ; col++)

最后一个嵌套for循环有一个与内部for循环有关的逻辑问题。因为你从0开始递减,所以你只是试图访问数组中的负索引而得到一个越界异常。因此,简单的修复应该是将col初始化到最后一列,并将条件更改为大于或等于3的col,因为您正在访问列,col,col-上的元素1,col-2和col-3。如果这令人困惑,请以这种方式思考。您正在检查从col开始的列和前面的三列。如果甚至没有四列开头怎么办?这就是条件col >= 3的原因,因为您检查了一列以及之前的三列,直到您到达第4列(col = 3)。一旦您到达第3列(col = 2),就无法检查该列和之前的三列,因为此时只有3列要检查。对于-3,应该对for ( int row = 0; row <= a.length - 3 ; row++)进行类似于其他3个嵌套循环的更改。它应该看起来像这样,

for ( int row = 0; row <= a.length - 4 ; row++) {
            for (int col = a[row].length - 1; col >= 3; col--)