我有一个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/

10-15 16:23