2 qq 37823305 qq_37823305 于 2017.09.14 10:39 提问

两个集合删除相同对象,删除报错 5C

//部分上线省份
List orgaList = orgaService.getSubOrgaListByCode(billCycle);
// 全部省分
List orgaListAll = orgaService.getSubOrgaListByCodeALL(jgCode);
//遍历得到未上线省份
for (Orga orga : orgaList) {
for (Orga orgaAll : orgaListAll) {
String codeALL = orgaAll.getCode();
String code = orga.getCode();
if (codeALL.equals(code)) {
orgaListAll.remove(orgaAll);
}
}
}

    遍历的时候会出错。java.util.ConcurrentModificationException
    Orga对象里面有一个code  和name字段

8个回答

baokx
baokx   2017.09.14 10:56

楼主就是相求个差集的嘛。jdk已经提供了比较好的实现啊。

 List<String> list1 = new ArrayList<String>();
        list1.add("1");
        list1.add("2");
        list1.add("3");
        list1.add("4");
        list1.add("5");
        list1.add("6");

        List<String> list2 = new ArrayList<String>();
        list2.add("1");
        list2.add("2");
        list2.add("3");

        List<String> result = new ArrayList<String>();
        result.addAll(list1);
        result.removeAll(list2);
        System.out.println("差集:"+result);

至于你的异常的问题,如果在循环的过程中删除集合的元素,需要用迭代器iterator迭代并且调用iterator.remove()。否则报java.util.ConcurrentModificationException,再深入可看arraylist的源码,就知道为什么会这样了。

syt_Jimmy
syt_Jimmy   2017.09.14 10:49

//遍历得到未上线省份
for (Orga orga : orgaList) {
for (int i = orgaListAll.saiz()-1;i--) {
Orga orgaAll = orgaListAll.get(i);
String codeALL = orgaAll.getCode();
String code = orga.getCode();
if (codeALL.equals(code)) {
orgaListAll.remove(orgaAll);
}
}
}

syt_Jimmy
syt_Jimmy 写错了 少一个判断条件
2 个月之前 回复
syt_Jimmy
syt_Jimmy   2017.09.14 10:49

//遍历得到未上线省份
for (Orga orga : orgaList) {
for (int i = orgaListAll.saiz()-1;i>=0;i--) {
Orga orgaAll = orgaListAll.get(i);
String codeALL = orgaAll.getCode();
String code = orga.getCode();
if (codeALL.equals(code)) {
orgaListAll.remove(orgaAll);
}
}
}

baokx
baokx   2017.09.14 11:00
 result.clear();
        result.addAll(list1);
        result.retainAll(list2);
        System.out.println("交集:"+result);

        result.clear();
        result.addAll(list1);
        result.addAll(list2);
        System.out.println("并集:"+result);
baokx
baokx   2017.09.14 11:16

有判断条件的话就去覆写一下Orga 类的equals方法。如果这样做会影响其他地方的话,那就新建一个result集合,在循环的过程中往result里添加元素,最后得到未上线的集合也没问题啊。

qq_35728177
qq_35728177   Ds   Rxr 2017.09.14 11:20

楼上说的很清楚了,简而言之,for循环删除list中的元素的时候,list的排序是会变化的,这时候就会报如上错误
http://www.cnblogs.com/andy-zhou/p/5339683.html

luominqi
luominqi   2017.09.14 11:22

两个集合嵌套循环时候,调用删除的话的时候,需要判断删除集合的位数,容易造成越界,可以做个控制或者新建一个集合,将需要的数据放到新建的集合中

shui878412
shui878412   2017.09.14 15:31

在循环遍历集合的过程中不能删除集合的元素
按照你的思路调整下代码就可以了(如下),当然还有更好的方法来过滤掉重复的数据。
//部分上线省份
List orgaList = orgaService.getSubOrgaListByCode(billCycle);
// 全部省分
List orgaListAll = orgaService.getSubOrgaListByCodeALL(jgCode);
List removeList = new ArrayList();
//遍历得到未上线省份
for (Orga orga : orgaList) {
for (Orga orgaAll : orgaListAll) {
String codeALL = orgaAll.getCode();
String code = orga.getCode();
if (codeALL.equals(code)) {
removeList.add(orgaAll);
//orgaListAll.remove(orgaAll);
}
}
}
orgaListAll.removeAll(removeList);

Csdn user default icon
上传中...
上传图片
插入图片