Simplificación de sucesivas declaraciones "if" en Java
if-statement multidimensional-array (6)
Esta pregunta ya tiene una respuesta aquí:
Tengo una serie de declaraciones if
, como se muestra a continuación:
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;
}
¿Hay una manera de simplificar / condensar estas declaraciones con Java?
Además de las respuestas que ya tiene, también puede usar los bucles mejorados (y reutilizar el rango, ya que es el mismo para ambos).
int[] range = { -1, 0, 1 };
for (int i : range) {
for (int j : range) {
if ((i != 0 || j != 0) && board[i][j]) {
ar++;
}
}
}
Este código debe dar el mismo resultado (probablemente desee verificar que siempre esté dentro de los límites de la matriz)
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++;
}
}
}
Lo siguiente sería un equivalente más visual, fácilmente extensible a otras formas del área de interés. Observe los operadores ternarios, ?:
Que son necesarios en Java para convertir bools a ints.
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);
Parece que estás probando los cuadrados circundantes aparte de (x, y) en sí. Usaría un bucle para mantener un contador, con un paso adicional para excluir la celda central (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;
}
}
}
Además, tenga en cuenta que el == verdadero no es necesario. Las declaraciones booleanas son ciudadanos de primera clase en Java.
Puedes simplificar lo siguiente también:
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;
}
}
}
Simplemente recorre la posición que te interesa. Saltando el centro de la "caja".
Sugerencia: accede a una matriz 2D por fila y luego por columna, o [y][x]
(al menos, así es como traduciría el tablero al mirar el código).
// 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;
}
}
}
Cuidado: la excepción fuera de límites no se maneja