我有一系列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简化/压缩这些语句?
答案 0 :(得分:43)
简单地绕过你关心的位置。跳过"框的中心"。
提示:您可以按行然后列或[y][x]
访问2D数组(至少,您是如何通过查看码)。
// 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;
}
}
}
注意 - 未处理超出范围的异常
答案 1 :(得分:13)
以下将是更直观的等效物,可轻松扩展到其他感兴趣区域的形状。注意三元运算符?:
,它们是Java中将bool转换为整数的必要条件。
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);
答案 2 :(得分:10)
除了您已有的答案之外,您还可以使用增强型for循环(并重复使用范围,因为两者都相同)。
int[] range = { -1, 0, 1 };
for (int i : range) {
for (int j : range) {
if ((i != 0 || j != 0) && board[i][j]) {
ar++;
}
}
}
答案 3 :(得分:8)
这段代码应该给出相同的结果(可能你想检查你是否总是在矩阵的范围内
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++;
}
}
}
答案 4 :(得分:5)
您也可以简化如下:
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;
}
}
}
答案 5 :(得分:4)
看起来你正在测试除(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中的一等公民。