Изучение if / else против оператора if / if

#java

#java

Вопрос:

Я пытался написать код, в котором все 0 будут перемещены вправо от массива. Я просто использовал левый и правый указатели.

  public class Solution {
      public int[] moveZero(int[] array) {
        // Write your solution here
        if (array.length==0) {
          return array;
        }
        int left=0;
        int right=array.length-1;
        while (left<=right) {
          if (array[left]!=0) {
            left =1;
          } 
          if (array[right]==0) {
            right-=1;
          } else {
            int temp = array[left];
            array[left] = array[right];
            array[right] = temp;
            left =1;
            right-=1;
          }
        }
        return array; 
      }
    }
 

Я знаю, что здесь я должен использовать if / else if вместо if / if, вот почему у меня есть индекс из связанной ошибки. Но я не понимаю, почему? Если у меня есть оператор if / if, какая разница, что это делает, а не использование if / else if в этом вопросе?

Комментарии:

1. if / else означает, что может выполняться только одна ветвь; если есть два отдельных if оператора, то оба их блока могут выполняться (если оба условия верны).

Ответ №1:

 if (condition1) {
   a();
} else if (condition2) {
   b();
} else {
   c();
}
 

означает то же самое, что

 if (condition1) {
    a();
} else {
    if (condition2) {
        b();
    } else {
        c();
    }
}
 

So else if — это просто сокращение для else с if внутренним.

Чтобы понять, почему ваш код выдает an ArrayIndexOutOfBoundsException , самый простой способ — пошаговое выполнение кода в отладчике (обратитесь к документации вашей среды разработки, чтобы узнать, как это сделать).

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

Ответ №2:

Я не думаю, что есть какая-либо причина использовать if /else вместо if / if, у них обоих есть свое место. В операторе if / if, если второй if оператор полагается на то, что предыдущий равен false, его следует преобразовать в оператор if / else . Если else оператор в операторе if / else не имеет ничего общего с if оператором перед ним, то его следует преобразовать в два отдельных оператора if.

В качестве примера, когда следует использовать оператор if / else (для выполнения того же, что и ваш):

 public class Solution {
    public int[] moveZero(int[] inputArray) {
        int[] outputArray = new int[inputArray.length];

        int left = 0;
        int right = inputArray.length - 1;

        for (int num : inputArray) {
            if (num == 0) {
                outputArray[right] = num;

                right --;
            } else {
                outputArray[left] = num;

                left   ;
            }
        }

        return outputArray;
    }
}