Я пишу короткий алгоритм в Java, используя Netbeans.Заявление о возврате и разрыв не работает в «While Loop»
Проблема, с которой я столкнулась, заключается в том, что код игнорирует оператор return в цикле while. Я также попробовал заявление о разрыве, и он также игнорирует это.
Однако странная часть всего этого заключается в том, что когда я запускаю программу с точками останова, она останавливается, когда она должна (когда она видит определенное значение). Если я запустил его без контрольных точек, он пройдет мимо этой точки.
Вот немного кода:
while (!openList.isEmpty()) {
// 1. Remove the best node from OPEN, call it current
int bestValue = Integer.MAX_VALUE;
for (BestFirstNode inOpen : openList) {
if ((inOpen.x == current.x) && (inOpen.y == current.y)) {
//skip this node
}
// 2.If one of the values in openList is the goal state, return the goal value
if (inOpen.value < bestValue) {
if (inOpen.value == goal) {
System.out.println("GOAL!");
openList.clear();
return goal;
}
//else sent thevalue if the new current nodes
bestValue = inOpen.value;
current = inOpen;
//set the new x and y values that will be used to check
//for successors
x = inOpen.x;
y = inOpen.y;
}
}
//print the current node and its coordinates
System.out.println("Current: " + current.value);
System.out.println("x: " + current.x + " y: " + current.y + "\n-------------");
//remove current from the openList so it can't be used again
openList.remove(current);
//3. Create current's successors.
Set<BestFirstNode> successors = new HashSet();
int min = 0;
int max = 2;
//get the top successor
if ((x <= max) && (x >= min) && (y - 1 <= max) && (y - 1 >= min)) {
successors.add(grid[x][y - 1]);
}
//get the bottom successor
if (x <= max && x >= min && y + 1 <= max && y + 1 >= min) {
successors.add(grid[x][y + 1]);
}
//get the left successor
if (x - 1 <= max && x - 1 >= min && y <= max && y >= min) {
successors.add(grid[x - 1][y]);
}
//get the right successor
if (x + 1 <= max && x + 1 >= min && y <= max && y >= min) {
successors.add(grid[x + 1][y]);
}
//remove the parent node from the successors list
Set<BestFirstNode> successorsFinal = new HashSet<>();
for (BestFirstNode successor : successors) {
if (successor != current.parent) {
successorsFinal.add(successor);
}
}
//4. Evaluate each successor, add it to OPEN, and record its parent.
for (BestFirstNode successor : successorsFinal) {
openList.add(successor);
successor.parent = current;
}
}
Я прочитал несколько других должностей относительно подобных вопросов. Чтение одного сообщения (here) привело меня к попытке запустить отладчик без контрольных точек. Без них я получаю ту же проблему, но я не совсем понимаю ответ. Я также попробовал очистить список, поэтому условие while будет недействительным, но оно все равно продолжается.
Итак, я полагаю, что мой вопрос двоякий:
Как код может полностью игнорировать разрыв или оператор возврата? И как вы можете получить один результат с помощью контрольных точек, а другой без них?
Edit: я добавил полный цикл, а для ясности
Наблюдайте за переменными при отладке, вы найдете результат. – Rugal
@Rugal Я не уверен, что понимаю, как это поможет. Когда я отлаживаю, я получаю ожидаемый результат. – JustBlossom
Откуда появился ваш объект 'inOpen'? Если вы в основном повторяете свой 'openList', вам может быть лучше подходит для этой цели с помощью цикла for-each-loop. Если нет, посмотрите во время отладки свою переменную 'inOpen.value'. Ваш код даже передает второй запрос if? –