Java 如何获取二维阵列中某点的所有相邻点?
我试图获得二维数组中简单的一个字符串组合的所有邻居。也就是说,我的输出在3x5中看起来是这样的: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
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)
,不是吗?