Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取二维阵列中某点的所有相邻点?_Java_Arrays_Loops - Fatal编程技术网

Java 如何获取二维阵列中某点的所有相邻点?

Java 如何获取二维阵列中某点的所有相邻点?,java,arrays,loops,Java,Arrays,Loops,我试图获得二维数组中简单的一个字符串组合的所有邻居。也就是说,我的输出在3x5中看起来是这样的: A B C D E F A S D F S A G S A 所以(1,0)的邻居应该是=abesa。 目前我有以下几点: public void getNeighborsOfPoint(int x, int y) { for (int xx = -1; xx <= 1; xx++) { for (int yy = -1; yy <= 1; y

我试图获得二维数组中简单的一个字符串组合的所有邻居。也就是说,我的输出在3x5中看起来是这样的:

A B C
D E F
A S D 
F S A
G S A
所以(1,0)的邻居应该是=abesa。 目前我有以下几点:

public void getNeighborsOfPoint(int x, int y) {

        for (int xx = -1; xx <= 1; xx++) {
            for (int yy = -1; yy <= 1; yy++) {
                if (xx == 0 && yy == 0) {
                    continue; // You are not neighbor to yourself
                }
                if (Math.abs(xx) + Math.abs(yy) > 1) {
                    continue;
                }
                if (isOnMap(x + xx, y + yy)) {
                    System.out.println(grid[x+xx][y+yy]);
                }
            }
        }
   

 public boolean isOnMap(int x, int y) {
        return x >= 0 && y >= 0 && x < length && y < width;
    }
public void getNeighborsOfPoint(int x,int y){
对于(int xx=-1;xx=0&&y>=0&&x
然而,在我提供的示例中,它只返回了一个ea(它没有交叉返回)
什么是使其工作的正确代码?请注意,输入并不总是3 x 5。它可能是x和y s的许多不同组合。您在当前组中没有得到对角线的原因是第二个
if
语句。例如,您需要涵盖
(2,1)
即当
xx
1
yy
1
时。但是
abs(1)+abs(1)=2
2>1
,因此您不包括它

作为重构练习,如果将for循环的内部简化为一个条件,可能会更简洁一些

if (expression) { 
    continue 
}; 
// other stuff
相当于

if (!expression) {
  // other stuff.
}

对你来说,
表达式(在psuedocode中)是
not(xx=0和yy=0)和isOnMap(xx,yy)
你在当前组中没有得到对角线的原因是第二个
if
语句。你需要包括,例如,
(2,1)
即当
xx
1
yy
1
时。但是
abs(1)+abs(1)=2
2>1
,因此您不包括它

作为重构练习,如果将for循环的内部简化为一个条件,可能会更简洁一些

if (expression) { 
    continue 
}; 
// other stuff
相当于

if (!expression) {
  // other stuff.
}

对于您来说,
表达式(在psuedocode中)是
而不是(xx=0和yy=0)和isOnMap(xx,yy)
由于此代码,对角线不包括在内:

if (Math.abs(xx) + Math.abs(yy) > 1) {
    continue;
}

当它位于对角线上时,
Math.abs(xx)==1和&Math.abs(yy)==1
。因此它们的总和将大于1。在此处使用此代码将跳过对角线。

由于此代码,对角线不包括在内:

if (Math.abs(xx) + Math.abs(yy) > 1) {
    continue;
}
当它位于对角线上时,
Math.abs(xx)==1&&Math.abs(yy)==1
。因此它们的总和将大于1。通过在此处使用此代码,您跳过了对角线。

在循环中,continue关键字意味着您将跳过循环的下一次迭代。在您的情况下,您有:

            if (Math.abs(xx) + Math.abs(yy) > 1) {
                continue;
            }
            if (isOnMap(x + xx, y + yy)) {
                System.out.println(grid[x+xx][y+yy]);
            }

这样,如果验证了第一个条件,就不会打印任何答案,也就是说,程序不会认为(XX,yy)是一个邻域。 在您的ABESA示例中,B和S因此被忽略。

在循环中,continue关键字意味着您将跳到循环的下一次迭代。在您的情况下,您有:

            if (Math.abs(xx) + Math.abs(yy) > 1) {
                continue;
            }
            if (isOnMap(x + xx, y + yy)) {
                System.out.println(grid[x+xx][y+yy]);
            }

这样,如果验证了第一个条件,就不会打印任何答案,也就是说,程序不会认为(XX,yy)是一个邻域。


在ABESA示例中,B和S因此被忽略。

如果要使用具有可变行数和列数的二维数组,则必须将它们作为参数传递给您的
isOnMap
方法,如下所示:

public static boolean isOnMap(int x, int y, int length, int width) {
    return x >= 0 && y >= 0 && x < length && y < width;
}

如果要使用具有可变行数和列数的二维数组,则必须将它们作为参数传递给您的
isOnMap
方法,如下所示:

public static boolean isOnMap(int x, int y, int length, int width) {
    return x >= 0 && y >= 0 && x < length && y < width;
}

只需删除第二条if语句。它应该做什么?只需删除第二条if语句。它应该做什么?
A B E S A
将是
D
at
(x,y)=(0,1)
,而不是
B
at
(1,0)的邻居
,不是吗?
A B E S A
将是
D
at
(x,y)=(0,1)
的邻居,而不是
B
at
(1,0)
,不是吗?