我有两个类型为RemoveTest的ArrayLists。我把它们放在地图上。 此外,我必须迭代地图,并为每个我需要检查的arraylist 如果任何元素的mid与任何其他元素相同 然后rmid从列表中删除这两个元素。
我运行下面的代码..但我只需要确认我的方法。 虽然我不是直接从hashmap中删除..而是从arraylist中删除 在该arraylist的迭代完成之后。据我所知 ConcurrentModificationException不应该来......并且方法似乎是正确的 只要 但有人可以确认是否存在任何机会或情况 ConcurrentModificationException可以用于我的代码 因为我最终得到了在HashMap中被修改的列表。
List<RemoveTest> eleList = new ArrayList<RemoveTest>();
List<RemoveTest> eleList2 = new ArrayList<RemoveTest>();
Map<String, List<RemoveTest>> testMap =new HashMap<String,List<RemoveTest();
RemoveTest obj1 = new RemoveTest();
obj1.setmId("m1");
obj1.setRmId("");
RemoveTest obj2 = new RemoveTest();
obj2.setmId("m2");
obj2.setRmId("m1");
RemoveTest obj3 = new RemoveTest();
obj3.setmId("m3");
obj3.setRmId("");
RemoveTest obj4 = new RemoveTest();
obj4.setmId("m4");
obj4.setRmId("m3");
RemoveTest obj5 = new RemoveTest();
obj5.setmId("m5");
obj5.setRmId("m4");
RemoveTest obj = new RemoveTest();
obj.setmId("m");
obj.setRmId("");
eleList.add(obj1);
eleList.add(obj2);
eleList.add(obj3);
eleList.add(obj4);
eleList.add(obj5);
eleList.add(obj);
//new
RemoveTest obj6 = new RemoveTest();
obj6.setmId("m6");
obj6.setRmId("");
RemoveTest obj7 = new RemoveTest();
obj7.setmId("m7");
obj7.setRmId("m6");
eleList2.add(obj6);
eleList2.add(obj7);
testMap.put("t1", eleList);
testMap.put("21", eleList2);
Set<RemoveTest> removals = new HashSet<RemoveTest>();
Set<String> matchingFwdRevMIds = new HashSet<String>();
for(Map.Entry<String, List<RemoveTest>> removeTestMap : testMap.entrySet()){
List<RemoveTest> grp = removeTestMap.getValue();
String key = removeTestMap.getKey();
for (int i=0;i<grp.size();i++){
RemoveTest fwdM = grp.get(i);
String fwdMId = fwdM.getmId();
if(matchingFwdRevMIds.contains(fwdMId)){
System.out.println("continue becoz "+ fwdMId );
continue;
}
for (int j=i+1; j<grp.size();j++){
RemoveTest nextM = grp.get(j);
String mId = nextM.getmId();
String revMId = nextM.getRmId();
if(revMId!=null){
if(matchingFwdRevMIds.contains(revMId)){
System.out.println("adding "+ mId);
matchingFwdRevMIds.add(mId);
removals.add(nextM);
}
if(revMId.equals(fwdMId)){
matchingFwdRevMIds.add(fwdMId);
matchingFwdRevMIds.add(mId);
removals.add(fwdM);
removals.add(nextM);
}
}
}
}
grp.removeAll(removals);
}
for(Map.Entry<String, List<RemoveTest>> removeTestMap : testMap.entrySet()){
List<RemoveTest> grp = removeTestMap.getValue();
for(RemoveTest test : grp){
System.out.println("final mid "+ test.getmId());
}
}
答案 0 :(得分:0)
不,当您在HashMap上进行迭代时,修改在HashMap
中用作值的对象是完全正常的。只有当您在迭代时向ConcurrentModificationException
添加或删除条目时才会出现HashMap
。
顺便说一句,像你这样改变价值是好的。但是永远不会修改HashMap条目中HashMap条目的键对象。 (确切地说,永远不要修改它的hashCode被改变和/或它的equals方法产生不同的结果),否则你可能无法找到你的条目。