2014-01-19 3 views
-1

У меня есть два типа ArrayLists типа RemoveTest. И я положил их на карту. Далее, я должен перебирать карту и для каждого arraylist мне нужно проверить , если какая-либо часть элемента такая же, как и любые другие элементы rmid, то удалите оба этих элемента из списка.Изменение содержимого ArrayList, помещенного в HashMap

У меня есть код ниже, но мне просто нужно подтвердить мой подход. Хотя я не удаляю непосредственно из hashmap .., но из arraylist после завершения итерации для этого arraylist. Согласно моему пониманию ConcurrentModificationException не come..and подхода представляется правильным только Но Может кто-то пожалуйста, убедитесь, что есть какие-то шансы или сценарии, где ConcurrentModificationException может прийти на мой код как я в конечном счете, получения списка contatined в 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

Нет, Actaully Я изменяю список после завершения итерации .. removeAll (удаление), где удаление - это HashSet. Просто по той причине, что я не хотел модифицировать arraylist во время его повторного использования ... Я использовал HashSet для хранения элементов, которые нужно удалить из ArrayList. – user2971387

+0

Возможно, вы захотите удалить свой пример до соответствующих частей, чтобы сделать его более читаемым. Не нужно добавлять много записей RemoveTest, и вы не дали нам определения класса RemoveTest. Также есть синтаксическая ошибка в строке, которая говорит «новый HashMap». –

+0

Я буду помнить со следующего раза .. включить только нужный код. – user2971387

ответ

0

Нет, это прекрасно, чтобы изменить объект, который используется в качестве значенияв HashMap в то время как Ваши, итерации в HashMap. ConcurrentModificationException появляется только в том случае, если вы добавляете или удаляете записи в/из HashMap во время итерации по ней.

Как в сторону, изменение значения, как и у вас, в порядке. Но never изменить объект, который является ключ записи HashMap, пока он находится в HashMap. (Чтобы быть точным, никогда не изменяйте его таким образом, чтобы его хэш-код был изменен и/или его метод equals выдавал другой результат), иначе вы больше не сможете найти свою запись.

+0

Спасибо за ответ. Я продолжу этот подход. – user2971387

Смежные вопросы