Как я могу использовать «или» в операторе if в Java без необходимости повторного ввода всего выражения? - PullRequest
2 голосов
/ 14 февраля 2011

Я пишу код для проекта тральщика для класса, и один метод - numAdjMines, который подсчитывает мины вокруг ячейки в массиве, каждый тип ячейки имеет свое значение, например, мин -2, в то время как мин с флаг на них -4. Я хочу написать только один оператор if, но в итоге мне приходится просто писать один и тот же код дважды, с разными значениями в конце.

if (row >= 1 && col >= 1 && boardArray[row - 1][col - 1] == MINE)
    {
        adjMines = adjMines + 1;
    }
if (row >= 1 && col >= 1 &&
            boardArray[row - 1][col - 1] == FLAGGED_MINE)
    {
        adjMines = adjMines + 1;
    }

Я пытался использовать || для или и написание || boardArray [row-1] [col-1] == FLAGGED_MINE в конце первого, но затем игнорируется начало проверки строки и столбца. Есть ли короткий компактный способ написать этот код?

Ответы [ 6 ]

4 голосов
/ 14 февраля 2011

Ваш приведенный выше код фактически может быть сжат в один оператор IF, однако я предполагаю, что ваш действительный код содержит больше операторов, в противном случае вы бы это уже сделали.

Самый простой способ упростить такой код - разбить его на два уровня операторов IF. Внешний содержит общее условие, а внутренние содержат определенные условия.

if (row >= 1 && col >= 1 ){

    int cell = boardArray[row - 1][col - 1];

    if( cell == MINE ){
        // Code here
    }

    else if( cell == FLAGGED_MINE )
    {
        // Code here
    }

}
2 голосов
/ 14 февраля 2011

Чтобы избежать повторения, вы можете использовать вложенные операторы if, т. Е. Оба условия полагаются на то, что row & col является> = 1, поэтому включите это в свой собственный оператор.

Тогда, я думаю, вы хотите избежатьвытащить значение из массива несколько раз, поэтому лучше всего присвоить его переменной.это, вероятно, не более эффективно во время выполнения, но лучше смотреть.

if (row >= 1 && col >= 1)
{
    int value = boardArray[row - 1][col - 1];
    if (value == MINE || value == FLAGGED_MINE)
    {
        adjMines = adjMines + 1;
    }
}
0 голосов
/ 14 февраля 2011
for(    int r : array( row-1, row, row+1 ))
    for(int c : array( col-1, col, col+1 ))
    {
        if(r==row && c==col) // center
            continue; 

        if(0<=r&&r<ROWS && 0<=c&&c<COLS) // within bounds
        {
            int state = boardArray[r][c];
            if(state==MINE||state==FLAGGED_MINE)
                adjMines++;
        }
     }

int[] array(int... ints){ return ints; }

Так что вам не нужно писать 8 отдельных случаев. Здесь нет ничего особенного, но если у вас 3D шахта ...

0 голосов
/ 14 февраля 2011

Я не уверен, что полностью понимаю вопрос, но следующий код более компактен и выполняет ту же цель:

if (row >= 1 && col >= 1 && 
    (boardArray[row - 1][col - 1] == MINE || boardArray[row - 1][col - 1] == FLAGGED_MINE)) {
    adjMines++;
}

Я не уверен, что запись в ваш основной массив - хорошая идеядля помеченных мин.Я предполагаю, что игрок может пометить свободную ячейку по ошибке, и это пометит ячейку как помеченную, и вы не узнаете, была ли там мина.Может быть, у вас есть логика для обработки этого, но всегда полезно иметь исходную плату (структуру данных) в безопасности для дальнейшего использования.

0 голосов
/ 14 февраля 2011

Я не уверен, какую часть вы пытаетесь избежать повторения, но вы можете избежать повторения в первой части, вложив операторы if.

if( row >= 1 && col >= 1 ) {
    if( boardArray[row - 1][col - 1] == MINE || 
        boardArray[row - 1][col - 1] == FLAGGED_MINE ) {

        adjMines = adjMines + 1;
    }
}

Я бы взял даже однусделайте шаг вперед и сделайте внутренний оператор if вызовом метода.

0 голосов
/ 14 февраля 2011

Вы можете использовать скобки для группировки условий

if(row >= 1 && col >= 1 && 
  (boardArray[row - 1][col - 1] == MINE
    || boardArray[row - 1][col - 1] == FLAGGED_MINE))
{
    adjMines = adjMines + 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...