Java 迭代时删除对象并将其添加到列表

Java 迭代时删除对象并将其添加到列表,java,listiterator,Java,Listiterator,我试图从列表中删除对象,但出现以下异常: failure:java.util.ConcurrentModificationException null 这就是我试图从列表中删除对象的方式: private List<testVO> removeDuplicateEntries(List<testVO> sessionList,List<testVO> dbList){ for (Iterator<testVO> dbItera

我试图从列表中删除对象,但出现以下异常:

failure:java.util.ConcurrentModificationException null
这就是我试图从列表中删除对象的方式:

private List<testVO> removeDuplicateEntries(List<testVO> sessionList,List<testVO> dbList){


        for (Iterator<testVO> dbIterator = dbList.listIterator(); dbIterator.hasNext(); ) {
            testVO voDB = dbIterator.next();

            for (Iterator<testVO> sessionIterator = sessionList.iterator(); sessionIterator.hasNext();) {
                testVO voSession = (testVO) sessionIterator.next();

                if(voDB.getQuestionID().intValue() == voSession.getQuestionID().intValue()){
                    //remove the object from sesion list
                    sessionIterator.remove();
                    //Add the object from DB to session list
                    sessionList.add(voDB);
                }

            }

        }

        return sessionList;
    }
private List removeDuplicateEntries(List sessionList,List dbList){
for(迭代器dbIterator=dbList.listIterator();dbIterator.hasNext();){
testvovodb=dbIterator.next();
for(迭代器sessionIterator=sessionList.Iterator();sessionIterator.hasNext();){
testVO会话=(testVO)sessioniter.next();
如果(voDB.getQuestionID().intValue()==voSession.getQuestionID().intValue()){
//从sesion列表中删除对象
sessioniter.remove();
//将对象从DB添加到会话列表
sessionList.add(voDB);
}
}
}
返回会话列表;
}
我想删除当前在
会话列表中的重复项
,并从
数据库列表
中添加要删除的重复项。。。
List<testVO> toRemove = ...
List<testVO> toAdd = ...

// in loop
toRemove.add(removed);
toAdd.add(added);

//after appropraite loops
yourList.addAll(toAdd);
yourList.removeAll(toRemove);
列表toAdd=。。。 //循环中 删除。添加(删除); 添加(已添加); //经过适当的循环 yourList.addAll(toAdd); 您的列表。删除全部(删除); 此处添加了
toRemove
,以防for循环的每个版本都使用一个;最好通过迭代器从集合中删除元素,因为它不会为搜索消耗更多的资源。

List toRemove=。。。
列表toAdd=。。。
//循环中
删除。添加(删除);
添加(已添加);
//经过适当的循环
yourList.addAll(toAdd);
您的列表。删除全部(删除);

此处添加了
toRemove
,以防for循环的每个版本都使用一个;最好通过迭代器从集合中删除一个元素,因为它不会消耗更多的搜索资源。

您不能在迭代时将其添加到会话列表中

    for (Iterator<testVO> dbIterator = dbList.listIterator(); dbIterator.hasNext(); ) {
        testVO voDB = dbIterator.next();

        List<testVO> toBeAdded = new LinkedList<>();
        for (Iterator<testVO> sessionIterator = sessionList.iterator(); sessionIterator.hasNext();) {
            testVO voSession = (testVO) sessionIterator.next();

            if(voDB.getQuestionID().intValue() == voSession.getQuestionID().intValue()){
                //remove the object from sesion list
                sessionIterator.remove();
                //Add the object from DB to session list
                //CANNOT DO: sessionList.add(voDB);
                toBeAdded.add(voDB);
            }
        }
        Collections.addAll(sessionList, toBeAdded);
    }
for(迭代器dbIterator=dbList.listIterator();dbIterator.hasNext();){
testvovodb=dbIterator.next();
List TOBEADED=新建LinkedList();
for(迭代器sessionIterator=sessionList.Iterator();sessionIterator.hasNext();){
testVO会话=(testVO)sessioniter.next();
如果(voDB.getQuestionID().intValue()==voSession.getQuestionID().intValue()){
//从sesion列表中删除对象
sessioniter.remove();
//将对象从DB添加到会话列表
//无法执行:sessionList.add(voDB);
添加(voDB);
}
}
Collections.addAll(sessionList,tobeaded);
}

您不能在遍历会话列表时将其添加到会话列表中

    for (Iterator<testVO> dbIterator = dbList.listIterator(); dbIterator.hasNext(); ) {
        testVO voDB = dbIterator.next();

        List<testVO> toBeAdded = new LinkedList<>();
        for (Iterator<testVO> sessionIterator = sessionList.iterator(); sessionIterator.hasNext();) {
            testVO voSession = (testVO) sessionIterator.next();

            if(voDB.getQuestionID().intValue() == voSession.getQuestionID().intValue()){
                //remove the object from sesion list
                sessionIterator.remove();
                //Add the object from DB to session list
                //CANNOT DO: sessionList.add(voDB);
                toBeAdded.add(voDB);
            }
        }
        Collections.addAll(sessionList, toBeAdded);
    }
for(迭代器dbIterator=dbList.listIterator();dbIterator.hasNext();){
testvovodb=dbIterator.next();
List TOBEADED=新建LinkedList();
for(迭代器sessionIterator=sessionList.Iterator();sessionIterator.hasNext();){
testVO会话=(testVO)sessioniter.next();
如果(voDB.getQuestionID().intValue()==voSession.getQuestionID().intValue()){
//从sesion列表中删除对象
sessioniter.remove();
//将对象从DB添加到会话列表
//无法执行:sessionList.add(voDB);
添加(voDB);
}
}
Collections.addAll(sessionList,tobeaded);
}

正如在其他答案中所解释的,您不能在迭代集合时将其添加到集合中。您必须使用迭代器本身修改信息,或者等到迭代完成

但是,普通的
迭代器只允许您删除项。使用
列表迭代器
也可以添加到列表中。因此,如果使用
sessionList.listIterator()
而不是
sessionList.iterator()
,则可以在迭代时添加项

不过,这与添加到列表(如果可能的话)的结果不同。假设您有一个列表:

[ A, B, C, D, E ]
您想用
C
替换
C
,用
D
替换
D
。如果使用列表迭代器,结果将是:

[ A, B, c, d, E ]
将项目添加到列表中会导致:

[ A, B, E, c, d ]
因此,如果您希望将项目追加到末尾,您应该按照其他答案所指出的那样,收集所有要添加的项目,并在完成迭代后
sessionList
添加所有项目

List<testVO> toRemove = ...
List<testVO> toAdd = ...

// in loop
toRemove.add(removed);
toAdd.add(added);

//after appropraite loops
yourList.addAll(toAdd);
yourList.removeAll(toRemove);
但是如果您想将它们替换到位(
[A,B,c,d,E]
),可以使用列表迭代器:

for (ListIterator<testVO> sessionIterator = sessionList.listIterator(); sessionIterator.hasNext();) {
    testVO voSession = (testVO) sessionIterator.next();

    if(voDB.getQuestionID().intValue() == voSession.getQuestionID().intValue()){
        //remove the object from sesion list
        sessionIterator.remove();
        //Add the object from DB to the session list 
        sessionIterator.add(voDB);
    }

}
for(ListIterator sessionIterator=sessionList.ListIterator();sessionIterator.hasNext();){
testVO会话=(testVO)sessioniter.next();
如果(voDB.getQuestionID().intValue()==voSession.getQuestionID().intValue()){
//从sesion列表中删除对象
sessioniter.remove();
//将对象从DB添加到会话列表
sessioniter.add(voDB);
}
}
不同之处在于,
sessionIterator
现在声明为
ListIterator
,并用
sessionList.ListIterator()
初始化,而且您使用的不是
sessionList.add()
,而是
sessionIterator.add()


请注意,
ListIterator
上的
add
操作是可选的,因此,根据列表实现的不同,此方法可能不起作用,并引发一个
不支持操作异常

,正如在其他答案中所解释的那样,您不能在迭代集合时将其添加到集合中。您必须使用迭代器本身修改信息,或者等到迭代完成

但是,普通的
迭代器只允许您删除项。使用
列表迭代器
也可以添加到列表中。因此,如果使用