У меня есть два типа 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());
}
}
Нет, Actaully Я изменяю список после завершения итерации .. removeAll (удаление), где удаление - это HashSet. Просто по той причине, что я не хотел модифицировать arraylist во время его повторного использования ... Я использовал HashSet для хранения элементов, которые нужно удалить из ArrayList. – user2971387
Возможно, вы захотите удалить свой пример до соответствующих частей, чтобы сделать его более читаемым. Не нужно добавлять много записей RemoveTest, и вы не дали нам определения класса RemoveTest. Также есть синтаксическая ошибка в строке, которая говорит «новый HashMap». –
Я буду помнить со следующего раза .. включить только нужный код. – user2971387