Разрыв цикла while, только когда выполнены все условия цикла for - PullRequest
0 голосов
/ 29 октября 2018

Я бы хотел разорвать петлю while только тогда, когда все "боты" находятся в вертикальном положении. (* Эти роботы упоминаются как мини-USB-роботы).

.upRight() возвращает true, когда бот стоит, и false, когда нет.

public static boolean checkSomething() throws ... {

        while (true) {

            for (i = 0; i < bots; i++) { // bots = 2
                if (!theMainBots[i].isUpright()) {
                    ...
                    Thread.sleep(1000); 
                } 
                else {
                    return true;

                }
            }
        }

Проблема, с которой я сталкиваюсь, заключается в том, что если метод isUpright() возвращает true для первого "бота", то все остальные боты остаются не проверенными и могут возвращать false. Намерение состоит в том, чтобы подождать, пока пользователь установит бота в вертикальное положение, прежде чем продолжить.

Ответы [ 5 ]

0 голосов
/ 29 октября 2018

вы можете создать список из массива ботов, итерировать по этому списку с помощью итератора если конкретный бот в вертикальном положении, удалите его из этого списка, используя iterator.remove. external while будет работать до тех пор, пока список не станет пустым.

public static boolean checkUpright()  {
    ArrayList<Bot> notUprightBots=   (ArrayList<Bot>) Arrays.asList(theBots);
    while (!notUprightBots.isEmpty()) {
        Iterator<Bot> iterator=notUprightBots.iterator();
        while(iterator.hasNext()){
            Bot bot=iterator.next();
            if (!bot.isUpright()) {
                System.out.println("Please ensure I'm upright");
                try{
                     Thread.sleep(500); 
                 }catch(InterruptedException  e){
                 } 

            }else {
                iterator.remove();
            }
        }
    }
    return true;

}
0 голосов
/ 29 октября 2018

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

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

public static void waitUntilAllUpright() throws InterruptedException {
    for (;;) { // forever loop
        boolean allUpright = true;
        for (i = 0; i < bots; i++) {
            if (! theBots[i].isUpright()) {
                allUpright = false;
                break;
            } 
        }
        if (allUpright)
            return;
        System.out.println("Please ensure I'm upright");
        Thread.sleep(500); 
    } // loop back to check all bots again
}
0 голосов
/ 29 октября 2018

Одним из способов достижения этого является использование переменной, которая будет определять, когда выходить из цикла. Ваша проблема здесь в том, что вам также нужно изменить цикл for для цикла while. Это почему? Потому что вы не знаете, был ли перемещенный вами бот перемещен или нет. Кроме того, внешний цикл не нужен, если только вы не хотите перепроверить. Таким образом, код будет выглядеть примерно так.

public static boolean checkUpright() throws InterruptedException {

    int counter = 0;
    while (counter <= theBots.length) { // bots = 2
        if (!theBots[i].isUpright()) {
            System.out.println("Please ensure I'm upright");
            Thread.sleep(500); 
        } else {
            counter ++;
        }
    }
}
0 голосов
/ 29 октября 2018

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

public static boolean checkUpright() throws InterruptedException {
    while (!areAllBotsUpright()) {
        System.out.println("Please ensure I'm upright");
        Thread.sleep(500);
    }
}

public static boolean areAllBotsUpright() {
   for (i = 0; i < bots; i++) {
       if (!theBots[i].isUpright()) {
           return false;     
       } 
   }

   return true;
}
0 голосов
/ 29 октября 2018

Если вы хотите подождать, пока пользователь вернет бота в вертикальное положение, вы можете изменить if на while:

while (true) {
     for (i = 0; i < bots; i++) { // bots = 2
         while(!theBots[i].isUpright()) {
             System.out.println("Please ensure I'm upright");
             Thread.sleep(500); 
         } 
     }               
     return true;     
}

Это будет циклически проходить через каждый элемент в Array, и, хотя любой данный бот не находится в вертикальном положении, он будет зацикливаться и спать, пока бот не будет повернут в вертикальном положении. В этом случае вам не нужно while(true) цикл:

public static boolean checkUpright() throws InterruptedException {
      for (i = 0; i < bots; i++) { // bots = 2
         while(!theBots[i].isUpright()) {
             System.out.println("Please ensure I'm upright");
             Thread.sleep(500); 
         } 
     }               
     return true;    
}
...