Android java для внезапного прерывания цикла

#java #android #for-loop

#java #Android #for-цикл

Вопрос:

У меня запущен следующий код:

 public static Level getNextLevel(Context context, int id)
{
    boolean found = false;
    ArrayList<Level> levels = getLevels(context);
    for(Level lvl : levels)
    {
        if (found)
        {
            return lvl;
        }
        if (lvl.id==id)
        {
            found=true;
        }
    }
    return null;
}
  

Когда я отслеживаю его, второй if срабатывает и найденная переменная становится true, затем выполняется еще одна итерация, и когда она доходит до строки «if (найдено)», я проверяю, и найденная переменная имеет значение true, но затем она выходит из блока for вместо перехода в блок if!

Уровни ArrayList содержат 5 элементов, и это происходит сразу после проверки первого элемента.

Есть предложения, почему это может произойти?

Комментарии:

1. Я думаю, вам нужно поменять местами два if с каждым, это означает, что сначала вам нужно проверить id, а затем, если найдено, вернуть значение true l

2. Нет, порядок блоков if правильный. Я хочу найти следующий элемент, и это происходит на бумаге! Проблема в том, что когда найдено значение true, оно не вводит if и просто пропускает возврат null

3. итак, с этим нужно работать, в чем проблема? вы отладили свой код?

4. Да, это должно сработать. Я отладил его, и, как я уже объяснял, он никогда не входит в первый блок if! Когда найденное становится истинным на втором if и оно повторно входит в цикл for для следующей итерации и переходит к первому if (теперь найдено значение true), оно не входит в if и просто выходит из цикла for и возвращает null

5. в режиме отладки это нормально, выходите из цикла и ждите return null; , когда найденные значения будут равны true, проверьте l значение и проверьте возвращаемое значение там, где когда-либо вызывался этот метод

Ответ №1:

Ваш метод getNextLevel() пытается выдать преемника записи в, ArrayList<Level> levels которая равна id . Но если id совпадает с последней записью, то цикл for заканчивается, и вы получаете null .

Комментарии:

1. @Rose: Спасибо. Затем, вы можете нажать стрелку «вверх» 😉 В любом случае, без дополнительной информации и отзывов спрашивающего совершенно точный ответ невозможен.

Ответ №2:

Вы говорите, что это found становится истинным на первой итерации, тогда логически следующая итерация войдет в первую if и вызовет return l , что означает, что ваш цикл остановится.

Итак, вопрос в том, должно ли на первой итерации быть установлено found значение true?

Комментарии:

1. Нет, моя проблема логически найдена, становится истинной в соответствующее время, но когда она становится истинной и попадает в строку «if (найдено)», она не попадает в блок if, даже если найдено значение true. вместо этого он выходит из блока for (пока итерации не завершены) и возвращает null вместо l .

Ответ №3:

РЕДАКТИРОВАТЬ: После дальнейшего изучения вашего вопроса кажется, что вы захотите полностью удалить return 1; . Поскольку ваш цикл for фактически входит в if (found) блок, но возврат заставляет его существовать, цикл и весь метод в целом.

Ответ №4:

К вашему СВЕДЕНИЮ, возвращенный «l» не является найденным «l», потому что он возвращается в следующем цикле, который является следующим элементом в arraylist

в любом случае, я предлагаю вам метод, который должен быть таким

 public static Level getNextLevel(Context context, int id){
    //boolean found = false; no need
    ArrayList<Level> levels = getLevels(context);
    for(Level lvl : levels)
    {
        if (lvl.id==id)
        {
             return lvl ;
        }
    }
    return null;
}
  

я заменил l на lvl, чтобы было понятно, он выглядит как 1, а l выглядит похожим на некоторых шрифтах.

Комментарии:

1. Как следует из названия метода, я хочу найти следующий элемент. Алгоритм верен. Моя проблема связана со странным поведением Java в отношении моего кода

2. хорошо, теперь я понял, что вы имели в виду, но я не могу найти ничего неправильного в вашем коде, если только найденный идентификатор не является последним элементом в массиве, поэтому следующий цикл не будет выполняться, в противном случае, это действительно странно, можете ли вы предоставить компонент Level? и некоторые примеры данных, я имею в виду симуляцию для getLevels (), я хотел бы запустить этот код на своей машине

Ответ №5:

Ваш код выглядит хорошо

     boolean found = false;
    ArrayList<Level> levels = getLevels(context);
    for(Level lvl : levels)
    {
        if (found)
        {
            return lvl;
        }
        if (lvl.id==id)
        {
            found=true;
        }
    }
    return null;
  

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

 for(int i=0; i<levels.size()-1; i  ){
   if(levels.get(i).id ==id )
   {
     return levels.get(i 1);
   }


}