Упрощение последовательных инструкций "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.