2015-07-22 3 views
-5

По какой-то причине итераторы работают неправильно. Я отлаживал код и у него есть элементы. Однако, когда дело доходит до строки перед возвратом, пусто. Любой намек?Java Iterator не работает должным образом

private Tasks loadChangeStatusOnTasks(final Tasks updatedTasks, final List<Boolean> changeStatusList) { 
     final Iterator<Task> it1 = updatedTasks.getTasks().iterator(); 
     final Iterator<Boolean> it2 = changeStatusList.iterator(); 
     while(it1.hasNext() && it2.hasNext()) { 
      it1.next().setAssigneeChanged(it2.next().booleanValue()); 
     } 
     final Tasks tasks = new Tasks(new ArrayList<TaskDTO>()); 
     tasks.setTasks(IteratorUtils.toList(it1)); 
     return tasks; 
    } 
+2

Итератор может только повторять один раз. – njzk2

+3

У нас недостаточно информации, чтобы помочь вам. Мы не знаем, что такое «Задачи», для начала. Пожалуйста, покажите короткую, но * полную * программу, демонстрирующую проблему. (оценка njzk2 правильная, но вы должны исправить вопрос по принципу ...) –

+0

Что значит «пустой»? Вы имеете в виду, что он дошел до конца? 'it1.hasNext() == false'? Это вполне ожидаемо. –

ответ

0

Когда вы достигнете tasks.setTasks(IteratorUtils.toList(it1)), it1 был исчерпан: все его элементы потребляются уже!

Если вы хотите создать новый список и назначить его, просто сделать:

return new Tasks(new ArrayList<>(updatedTasks.getTasks())); 
+0

Спасибо за ответ Жан, но как я могу уважать логику? Если я использую ваш оператор return, он просто вернет список, как он был раньше, не так ли? –

+0

Да, но что вы ожидаете от 'IteratorUtils.toList (it1)' '? Разница в том, что вы вызывали '' setAssigneeChanged'' для каждой '' Задачи''. Таким образом, содержимое списка изменено –

0

Итератора уже итерацию в предыдущем цикле, пока и не имеет больше .hasNext элементов(). Вот почему IteratorUtils.toList() даст пустой список.

Решение может состоять в том, чтобы создать список первым и перебрать цикл по списку, чтобы установить свойство assigneeChanged из другого итератора.