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)
注意 - 不处理超出范围的异常
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)
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)
这段代码应该给出相同的结果(可能你想检查你是否总是在矩阵的范围内
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)
您也可以简化如下:
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)