почему моя переменная не складывается в этих для операторов? - PullRequest
0 голосов
/ 22 февраля 2010

Я работаю над некоторой начинающейся логикой Java, и я не уверен, почему это не работает. Вот метод, который я сделал:

private void printSubclassBoxes(){
        int  coordinateX = ((getWidth() - BOX_WIDTH) /4);

        for ( int i = 0; i < 3; i++){

            double coordinateY = (getHeight() / 2);     
            GRect classBox = new GRect (coordinateX, coordinateY, BOX_WIDTH, BOX_HEIGHT);

            GLabel classLabel = new GLabel ("Program");
            double labelCoordinateX = (coordinateX + ((classBox.getWidth() / 2) - (classLabel.getWidth() / 2)));
            double labelCoordinateY = (coordinateY + ((classBox.getHeight() / 2) + (classLabel.getAscent() / 2)));
            add(classBox);
            add(classLabel, labelCoordinateX, labelCoordinateY);
            if (i == 1){
            coordinateX = (((getWidth() - BOX_WIDTH) /4) * 2);
        } 
        if (i == 2){
            coordinateX = (((getWidth() - BOX_WIDTH) /4) * 3);
        } 

        }   

    }

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

Для простоты, скажем,

100 = ((getWidth() - BOX_WIDTH)

int coordinateX = 25;

Насколько я понимаю, int i сначала прибегает к этому оператору if и добавляет 25 + 25, а затем координата X = 50.

затем в следующий раз в цикле i = 2, так что координата X = 75.

Это то, что я ожидаю, но это не так. Я, кажется, печатаю первые две коробки прямо друг на друга, а затем третий движется 25.

Спасибо за вашу помощь, ребята. Теперь, когда я разобрался с этой петлей, я пошел дальше и решил ее по-другому. В итоге я присвоил координату X другой переменной и добавил ее в конец:

int  coordinateX = ((getWidth() - BOX_WIDTH) /4);
        int otherCoordinateX = coordinateX;

        for ( int i = 0; i < 3; i++){

            double coordinateY = (getHeight() / 2);     
            GRect classBox = new GRect (coordinateX, coordinateY, BOX_WIDTH, BOX_HEIGHT);

            GLabel classLabel = new GLabel ("Program");
            double labelCoordinateX = (coordinateX + ((classBox.getWidth() / 2) - (classLabel.getWidth() / 2)));
            double labelCoordinateY = (coordinateY + ((classBox.getHeight() / 2) + (classLabel.getAscent() / 2)));
            add(classBox);
            add(classLabel, labelCoordinateX, labelCoordinateY);
            coordinateX = otherCoordinateX + coordinateX;

        }   

Ответы [ 4 ]

1 голос
/ 22 февраля 2010

Так как вы хотите увеличить значение до «следующей итерации», вы должны сделать это между первым / вторым и вторым / третьим, но вы помещаете обновление переменной coordinateX в конце цикла, чтобы вы могли проверять различные индексы : 0 и 1.

Что это значит?

Это работает:

for ( int i = 0; i < 3; i++)
{
  /* other part of the loop */  
  if (i == 0)
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 2);
  else if (i == 1)
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 3);
}  

но это тоже работает:

for ( int i = 0; i < 3; i++)
{
  if (i == 1)
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 2);
  else if (i == 2)
    coordinateX = (((getWidth() - BOX_WIDTH) /4) * 3);
  /* other part of the loop */  
}  
1 голос
/ 22 февраля 2010

У вас просто проблема с индексом циклов. В первый раз в вашем цикле i - это 0, а не 1. Во второй раз это 1, а не 2. Изменение ваших линий if (i == 1) и if (i == 2) на if (i == 0) и if (i == 1), соответственно, решит вашу проблему.

Хотя это все еще странный способ сделать цикл. Более стандартный способ сделать это, например, установить переменную incrementX, а затем просто безоговорочно добавлять ее каждый раз в цикле.

1 голос
/ 22 февраля 2010

на первой итерации цикла:

  • i = 0 и
  • coordinateX = 25, как и ожидалось.

В конце итерации coordinateX не не обновлено (начиная с i == 0).

Затем на второй итерации:

  • i = 1,
  • но все же coordinateX = 25, поскольку он не был обновлен.

В конце второй итерации coordinateX обновляется из-за теста if i == 1).

В третьей итерации

  • i = 2
  • используется новое значение coordinateX, которое было установлено в конце второй итерации.

Решение

Чтобы не изменять свой код каким-либо существенным образом, просто замените if (i == 1) на if (i == 0) и if (i == 2) на if (i == 1).

РЕДАКТИРОВАТЬ: Урок

В for(...) { } declaration тест i < 3 проверяется в начале каждой итерации, но часть i++ вызывается в конце каждой итерации.

0 голосов
/ 22 февраля 2010

Может показаться глупым ответом, но это то, что я бы сделал в этих ситуациях.Поместите кучу операторов печати, чтобы, когда оно зацикливалось, вы могли убедиться, что вы получите именно то, что ожидаете.Если это не определенная точка, начните пытаться определить, почему.

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