Многочисленные операторы IF, будучи истинными, вызывают проблемы

1

У меня возникают проблемы при условии, что условия нескольких операторов IF истинны.

Мой сценарий, например:

           if (B > A && B >= C && B > D && B> E )
           {
              while (h < B + 2)
              {
                 r.up();
                 h++;
              }
           }

           else if (D > A && D > B && D >= C && D > E )
           {
              while (h < D + 3)
              {
                 r.up();
                 h++;
              }
           }
           else if (C > A && C > B && C > D && C >= E )
           {
              while (h < C + 3)
              {
                 r.up();
                 h++;
              }
           }

Это всего лишь шаблон моего фактического кода, так что он выглядит немного читабельнее.

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

В основном, что я пытаюсь сделать, это increment 'h' в зависимости от того, какая переменная имеет самое высокое значение. Дело в том, что, когда 2 переменные имеют одинаковое значение (например, B и D оба равны 7), код вообще не работает.

Надеюсь, вы поняли, что я пытаюсь сказать и спасибо за ваше время!

  • 1
    Это всего лишь шаблон моего реального кода, просто он выглядит немного более читабельным . Я не завидую вам, если ваш код более нечитаем, чем этот. Это может быть QuickBasic. ООП кто-нибудь? :(
Теги:
if-statement

3 ответа

2
Лучший ответ

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

Ниже приведена схема изменения кода:

// You may want to make a dedicated method for this
int max = Math.max(Math.max(A, B), Math.max(C, D));
int additional;
if (max == A) {
    additional = 2;
} else if (max == B) {
    additional = 3;
} else if (max == C) {
    additional = 1;
} else if (max == D) {
    additional = 2;
} else {
    throw new IllegalStateException();
}
while (h < max + additional) {
    r.up();
    h++;
}

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

  • 0
    Это выглядит как хороший способ реструктурировать мой код, но вы забываете тот факт, что у меня также есть другая переменная (E). Math.max принимает только 2 аргумента, так как бы я сравнил все пять переменных друг с другом, используя этот же метод?
  • 0
    @antonlab Добавьте еще один уровень Math.max и еще один else if(...) к приведенному выше коду. Вы можете продолжать делать это, когда расширите свой код и до пяти переменных.
Показать ещё 3 комментария
4

Если я правильно понял ваш вопрос, вам нужно будет использовать все сравнения> =, а не>. Это решит проблему B = D.

Изменить. Возможно, вы захотите реорганизовать свой код. Существует много повторяющихся операций.

0

Реформируя его как

       int max = Integer.MIN_VALUE;
       if (B > A && B >= C && B > D && B> E )
       {
          max = B + 2;
       }
       else if (D > A && D > B && D >= C && D > E )
       {
          max = D + 3;
       }
       else if (C > A && C > B && C > D && C >= E )
       {
          max = C + 3;
       }

       if (max != Integer.MIN_VALUE)
       {
          while (h < max)
          {
             r.up();
             h++;
          }
       }

Видно, что A, B, D, E, (C-1) более или менее эквивалентны, и каждый хочет взять максимальное значение B, C-1, D плюс 2 или 3.

Возможно, логика может быть дополнительно уменьшена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню