在迭代时删除和添加对象列表

时间:2015-10-05 11:13:28

标签: java listiterator

我正在尝试从列表中删除对象,但我得到以下异常:

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中的重复项。

3 个答案:

答案 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