我正在尝试从列表中删除对象,但我得到以下异常:
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;
}
我想删除当前位于sessionList
的重复项,并添加dbList
中的重复项。
答案 0 :(得分:6)
迭代通过它时,无法添加到sessionList。
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);
}
答案 1 :(得分:2)
List<testVO> toRemove = ...
List<testVO> toAdd = ...
// in loop
toRemove.add(removed);
toAdd.add(added);
//after appropraite loops
yourList.addAll(toAdd);
yourList.removeAll(toRemove);
这里添加了toRemove
以防万一用于for循环的每个版本;最好通过迭代器从集合中删除一个元素,因为它不会消耗更多的搜索资源。
答案 2 :(得分:1)
正如其他答案中所解释的那样,在迭代时无法添加到集合中。你必须使用迭代器本身修改信息 - 或者等到你完成迭代。
但是,普通pi@raspberrypi ~ $ sudo su
root@raspberrypi:/home/pi# hciconfig dev
hci0: Type: BR/EDR Bus: USB
BD Address: 5C:F3:70:69:54:3D ACL MTU: 1021:8 SCO MTU: 64:1
DOWN
RX bytes:616 acl:0 sco:0 events:34 errors:0
TX bytes:380 acl:0 sco:0 commands:34 errors:0
root@raspberrypi:/home/pi# hciconfig dev up
root@raspberrypi:/home/pi# hcitool lescan
LE Scan ...
00:22:D0:6D:E0:E6 (unknown)
00:22:D0:6D:E0:E6 Polar H7 6DE0E61C
^Croot@raspberrypi:/home/pi# hcitool lecc 00:22:D0:6D:E0:E6
Connection handle 64
root@raspberrypi:/home/pi# gatttool -b 00:22:D0:6D:E0:E6 -I
[00:22:D0:6D:E0:E6][LE]> connect
Attempting to connect to 00:22:D0:6D:E0:E6
Error connect: Connection refused (111)
[00:22:D0:6D:E0:E6][LE]>
只允许您删除项目。使用Iterator
您还可以添加到列表中。因此,如果您使用ListIterator
而不是sessionList.listIterator()
,则可以在迭代时添加项目。
这与添加到列表(如果可能的话)有不同的结果。假设您有一个列表:
sessionList.iterator()
您希望将[ A, B, C, D, E ]
替换为C
,将c
替换为D
。如果使用列表迭代器,则结果为:
d
将项目添加到列表中会导致:
[ A, B, c, d, E ]
因此,如果您希望将项目追加到最后,您应该像其他答案一样指出,收集您要添加的所有项目,并在完成迭代后[ A, B, E, c, d ]
addAll
但是如果你想替换它们就位(sessionList
),你可以使用列表迭代器:
[ 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);
}
}
现在被声明为sessionIterator
并使用ListIterator
进行初始化,而且sessionList.listIterator()
代替sessionList.add()
使用sessionIterator.add()
。
请注意add
上的ListIterator
操作是可选的,因此,根据列表实现,此方法可能无效并抛出UnsupportedOperationException
。