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
操作是可选的,因此,根据列表实现的不同,此方法可能不起作用,并引发一个不支持操作异常
,正如在其他答案中所解释的那样,您不能在迭代集合时将其添加到集合中。您必须使用迭代器本身修改信息,或者等到迭代完成
但是,普通的迭代器只允许您删除项。使用列表迭代器
也可以添加到列表中。因此,如果使用