嘿,对于我的一些大学作业,我发现需要检查二维数组(网格)中的相邻单元格。我使用的解决方案有点使用异常,但是我正在寻找一种方法来清理它,而无需像我的一些同学那样加载if
语句。我当前的解决方案是
for ( int row = 0; row < grid.length; row++ ) {
for ( int col = 0; col < grid.length; col++ ) {
// this section will usually be in a function
// checks neighbours of the current "cell"
try {
for ( int rowMod = -1; rowMod <= 1; rowMod++ ) {
for ( int colMod = -1; colMod <= 1; colMod++ ) {
if ( someVar == grid[row+rowMod][col+colMod] ) {
// do something
}
}
}
} catch ( ArrayIndexOutOfBoundsException e ) {
// do nothing, continue
}
// end checking neighbours
}
}
我不禁想到使用异常来使我的代码工作的原因导致效率低下,因此我正在寻找有关如何在不牺牲可读性的情况下如何从代码中消除对异常的依赖的建议,以及如何做到的建议。此代码段通常更有效。提前致谢。
最佳答案
你可以试试看
首先确定网格的大小,假设其为8 X 8并分配MIN_X = 0,MIN_Y = 0,MAX_X = 7,MAX_Y = 7
您当前的职位由thisPosX,thisPosY表示,然后尝试以下操作:
int startPosX = (thisPosX - 1 < MIN_X) ? thisPosX : thisPosX-1;
int startPosY = (thisPosY - 1 < MIN_Y) ? thisPosY : thisPosY-1;
int endPosX = (thisPosX + 1 > MAX_X) ? thisPosX : thisPosX+1;
int endPosY = (thisPosY + 1 > MAX_Y) ? thisPosY : thisPosY+1;
// See how many are alive
for (int rowNum=startPosX; rowNum<=endPosX; rowNum++) {
for (int colNum=startPosY; colNum<=endPosY; colNum++) {
// All the neighbors will be grid[rowNum][colNum]
}
}
您可以分2个循环完成它。