我有一个ArrayList,里面充满了名为projectCurrent的对象“ Project”。每个项目都有其名称,状态,manDays等。
我想遍历此列表,并在每个项目中检查if (manDaysDone >= manDays)
。如果是这样,则表明项目已完成,我想更改其状态,将其从列表中删除,然后将其添加到另一个项目(projectsDone
)。
当我尝试使用Iterator实现我的目标时,似乎在迭代过程中丢失了到当前项目的链接,例如,在此代码中,在if条件中引发了NoSuchElementException
:
Iterator<Project> i = projectsCurrent.iterator();
while (i.hasNext()){
if (i.next().getManDaysDone() >= i.next().getManDays()){
i.next().setState(ProjectState.DONE);
}
}
只是为了阐明我想要实现的目标。下面的
for
循环可以完成这项工作,但是当然以后我会得到ConcurrentModificationException
:for (Project currentProject : projectsCurrent){
if (currentProject.getManDaysDone() >= currentProject.getManDays()) {
currentProject.setState(ProjectState.DONE);
projectsDone.add(currentProject);
this.budget += currentProject.getPrice();
projectsCurrent.remove(currentProject);
}
}
最佳答案
只有一张纸条。您打算从列表中随机删除项目。 ArrayList
实现不利于此。您应该改用LinkedList
。
要从List
正确删除元素,必须手动获取Iterator
并调用it.remove()
删除它。 (当您尝试在for(...)
中使用进行删除时,会出现并发修改异常,因为必须使用相同的迭代器进行迭代和删除)。
List<Project> projects = new LinkedList<>();
Iterator<Project> it = projects.iterator();
while (it.hasNext()) {
String project = it.next();
if (project.getManDaysDone() >= project.getManDays()) {
project.setState(ProjectState.DONE);
it.remove();
}
}
关于java - 带有对象的ArrayList,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53167671/