используя "i ++" в цикле for - PullRequest
1 голос
/ 27 ноября 2010

Привет У меня есть вопрос, который я могу использовать такой код:

        if (low != mid && mid != high) {
        for (int i = 0; i <= mid; i++) {
            boolean bool = Determinate.isPointLeftSide(a, auxiliaryListTwo.get(i), auxiliaryListTwo.get(i + 1));
            if (bool == false) {
                p = auxiliaryListTwo.get(i);

            } else {
                boolean bool1 = Determinate.isPointRightSide(a, auxiliaryListTwo.get(i + 1), auxiliaryListTwo.get(i));
                boolean bool2 = Determinate.isPointRightSide(a, auxiliaryListTwo.get(i + 1), b);
                if (bool1 == true && bool2 == true) {
                    p = auxiliaryList.get(i + 1);
                }
                else{
                    i++;
                }
            }

        }

    }

Я использовал "i ++" в остальной части, это правильно?

Ответы [ 6 ]

7 голосов
/ 27 ноября 2010

основное правило заключается в том, что вы не изменяете переменную счетчика (i здесь) в цикле. Если вы хотите пропустить текущую итерацию, вы должны использовать оператор continue;.

3 голосов
/ 27 ноября 2010

это правильно?

Если код хочет иметь эффект i = i +1, то это правильно. Поскольку вы уже увеличиваете i в операторе for, я буду увеличиваться в два раза, если он достигнет значения else. Пока вы проанализировали последствия этого в своем коде, у вас все будет хорошо. В вашем случае вам не придется беспокоиться о проблемах, выходящих за границы, потому что цикл вверху завершается, если i<=mid, и после i ++ нет кода. Однако при достижении i ++ цикл никогда не будет выполняться для определенных значений i, поскольку он эффективно пропускает итерацию.

Вот быстрый рефакторинг вашего кода для удаления бесполезных переменных. Для максимальной ясности вы должны поместить переменные обратно, но использовать более информативные имена переменных, такие как boolean isAToTheLeftOfB = ***. Комментарии твой друг !!

package example;
        if (low != mid && mid != high) {
        for (int i = 0; i <= mid; i++) {
            if ( ! Determinate.isPointLeftSide(a, auxiliaryListTwo.get(i), auxiliaryListTwo.get(i + 1))) {
                p = auxiliaryListTwo.get(i);

            } else {
                if ( Determinate.isPointRightSide(a, auxiliaryListTwo.get(i + 1), auxiliaryListTwo.get(i)) && Determinate.isPointRightSide(a, auxiliaryListTwo.get(i + 1), b) ) {
                    p = auxiliaryList.get(i + 1);
                }
                else{
                    i++;
                }
            }
        }
    }

EDIT: Спасибо Владимиру за указание на то, что вы должны использовать оператор continue вместо прямого увеличения счетчика. Это определенно более понятно и менее подвержено ошибкам.

2 голосов
/ 27 ноября 2010

Могу ли я предложить несколько советов по стилю?

Старайтесь не использовать двойные негативы. Э.Г.

if not condition
  task for false
else 
  task for true

Это может быть трудно читать. Проще сказать

if condition
  task for true
else 
  task for false

Это также не нормально говорить:

if (bool == false)
  do something

Мы обычно говорим

if !bool
  do something

И мы не будем использовать переменную с именем bool, а будем называть ее в соответствии с назначением. Э.Г.

boolean isLeftSide = Determinant....
1 голос
/ 27 ноября 2010

Возможно, вы захотите использовать цикл while, чтобы все выглядело более логичным. Это совершенно законный, но не «хороший» способ кодирования.

1 голос
/ 27 ноября 2010

Не комментируя ваш код, особенно, но он не считает это правильным.Цикл for является самоуправляемым в том смысле, что я увеличивается для вас.Когда вы также манипулируете значением i, результаты трудно предсказать.Потенциально вы можете оказаться за гранью коллекции, когда будете делать это.

0 голосов
/ 27 ноября 2010
`for (int i = 0; i <= mid; i++)

уже увеличивается, если true или false , поэтому, если вы используете снова, в противном случае он увеличивается вдвое

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...