#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);
}
}