Упрощение последовательных инструкций "if" в Java
У меня есть ряд операторов 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?
Ответы
Ответ 1
Просто зациклитесь на позиции, о которой вы заботитесь. Пропуск центра "окна".
Совет. Вы получаете доступ к двумерному массиву по столбцу , затем или [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;
}
}
}
Остерегайтесь - исключение исключений не обрабатывается
Ответ 2
Следующее было бы более визуальным эквивалентом, легко расширяемым для других форм интересующей области. Обратите внимание на тройные операторы, ?:
, которые необходимы в Java для преобразования bools в 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);
Ответ 3
В дополнение к уже имеющимся ответам вы также можете использовать расширенные для циклов (и повторно использовать диапазон, поскольку он одинаковый для обоих).
int[] range = { -1, 0, 1 };
for (int i : range) {
for (int j : range) {
if ((i != 0 || j != 0) && board[i][j]) {
ar++;
}
}
}
Ответ 4
Этот код должен дать тот же результат (возможно, вы хотите проверить, что вы всегда находитесь в границах матрицы
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++;
}
}
}
Ответ 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;
}
}
}
Ответ 6
Похоже, вы тестируете окружающие квадраты отдельно от (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.