修改放在HashMap中的ArrayList的内容

时间:2014-01-19 09:04:25

标签: java arraylist hashmap

我有两个类型为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());
        }
    }

1 个答案:

答案 0 :(得分:0)

不,当您在HashMap上进行迭代时,修改在HashMap中用作的对象是完全正常的。只有当您在迭代时向ConcurrentModificationException添加或删除条目时才会出现HashMap

顺便说一句,像你这样改变价值是好的。但是永远不会修改HashMap条目中HashMap条目的对象。 (确切地说,永远不要修改它的hashCode被改变和/或它的equals方法产生不同的结果),否则你可能无法找到你的条目。