Java中连续’if’语句的简化

我有一系列if语句,如下所示:

 if (board[x+1][y]==true) { ar+=1; } if (board[x][y+1]==true) { ar+=1; } if (board[x-1][y]==true) { ar+=1; } if (board[x][y-1]==true) { ar+=1; } if (board[x+1][y+1]==true) { ar+=1; } if (board[x+1][y-1]==true) { ar+=1; } if (board[x-1][y+1]==true) { ar+=1; } if (board[x-1][y-1]==true) { ar+=1; } 

有没有办法用Java简化/压缩这些语句?

只需环绕您关心的位置即可。 跳过“盒子”的中心。

提示:您可以按行然后按列访问2D数组,或者[y][x] (至少,这就是您从查看代码转换板的方式)。

 // int x, y; // position to look around for (int xDiff = -1; xDiff <= 1; xDiff++) { for (int yDiff = -1; yDiff <= 1; yDiff++) { if (xDiff == 0 && yDiff == 0) continue; if (board[y+yDiff][x+xDiff]) { ar += 1; } } } 

注意 - 不处理超出范围的exception

以下将是更直观的等效,易于扩展到感兴趣区域的其他形状。 注意三元运算符, ?:在Java中将bool转换为int所必需的。

 ar += (board[x-1][y-1]?1:0) + (board[x-1][y]?1:0) + (board[x-1][y+1]?1:0); ar += (board[x+0][y-1]?1:0) + (board[x+0][y+1]?1:0); ar += (board[x+1][y-1]?1:0) + (board[x+1][y]?1:0) + (board[x+1][y+1]?1:0); 

除了您已有的答案之外,您还可以使用增强型for循环(并重新使用范围,因为两者都相同)。

 int[] range = { -1, 0, 1 }; for (int i : range) { for (int j : range) { if ((i != 0 || j != 0) && board[i][j]) { ar++; } } } 

这段代码应该给出相同的结果(可能你想检查你是否总是在矩阵的范围内

 for(int i=-1; i<=1; i++) { for(int j=-1; j<=1; j++) { if((i != 0 || j != 0) && board[x+i][y+j]) { ar++; } } } 

您也可以简化如下:

 for(int i = x-1;i<=x+1;i++) { for(int j=y-1;j<=y+1;j++) { if(i==x && j==y) continue; if (board[i][j]) { ar+=1; } } } 

看起来你正在测试除(x,y)本身之外的周围方块。 我将使用循环来维护计数器,并使用额外的步骤来排除(x,y)中心单元格。

 for (int xTest = x - 1; xTest <= x + 1; xTest++) { for (int yTest = y - 1; yTest <= y + 1; yTest++) { if (xTest == x && yTest == y) { continue; } if (board[xTest][yTest]) { ar += 1; } } } 

另外,请注意== true是不必要的。 布尔语句是Java中的一等公民。