Как заставить программу всегда запускать первую итерацию цикла while? - PullRequest
6 голосов
/ 19 сентября 2011

Я пишу программу для реализации алгоритма, который я нашел в литературе. В этом алгоритме мне нужен цикл while;

while(solution has changed){
    updateSolution();
}

чтобы проверить, удовлетворяется ли условие while, я создал объект (того же типа, что и решение), называемый copy. Эта копия является копией решения до его обновления. Поэтому, если в решении произошли изменения, условие в цикле while выполнено.

Однако у меня возникают некоторые проблемы с поиском наилучшего решения для условий обоих объектов при выполнении цикла while, так как я начинаю с пустого решения (результирующего набора), и в это время копия также пуста (оба вызова конструктор класса). Это означает, что при выполнении цикла while оба объекта равны, и поэтому все операторы в цикле while не выполняются.

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

Код как сейчас:

SolutionSet solution = new SolutionSet();
SolutionSet copy = new SolutionSet();
boolean dummy = true;

while((!solution.equals(copy)) || dummy){
   dummy = false;
   copy = solution.copy();
   solution.update() // here some tests are done and one object may be added to solution
}

Ответы [ 3 ]

12 голосов
/ 19 сентября 2011

Использование do {} while (condition);.

1 голос
/ 19 сентября 2011

While проверяет условие и, если оно истинно, запускает указанный код.

Есть одна конструкция, которая немного отличается: Do... While.Он выполняет некоторый код и в конце блока проверяет, выполняется ли какое-либо условие.Например

do {
   this;
   that;
   that another;
} while (this == true);
1 голос
/ 19 сентября 2011

Вы можете сделать это с помощью оператора do-while:

SolutionSet solution = new SolutionSet();
SolutionSet copy = new SolutionSet();

do {
   copy = solution.copy();
   solution.update() // here some tests are done and one object may be added to solution
} while (!solution.equals(copy)); 
...