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

Era*_*n20 16 java if-statement multidimensional-array

我有一系列的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;
}
Run Code Online (Sandbox Code Playgroud)

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

cri*_*007 43

只需绕过你关心的位置.跳过"盒子"的中心.

提示:您可以按行然后按列访问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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意 - 不处理超出范围的异常

  • 没错,但明确意图总是好的. (4认同)
  • 只要它们与`[x] [y]`或`[y] [x]`保持一致,就没有什么区别. (3认同)

Eug*_*sev 13

以下将是更直观的等效,可以轻松扩展到感兴趣区域的其他形状.注意三元运算符,?:它是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);
Run Code Online (Sandbox Code Playgroud)

  • 也许更改为辅助函数`get(board,x-1,y-1)`,这样您就不需要重复三元组​​,也可以轻松添加边界检查. (3认同)

Edd*_*tis 10

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

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


Mik*_*nte 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++;
        }
   }
}
Run Code Online (Sandbox Code Playgroud)


Nam*_*man 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)