【发布时间】:2012-01-08 10:08:57
【问题描述】:
当我尝试从 HashMap 中删除项目时,我得到并发修改异常。我知道在迭代期间通过 HashMap 删除项目会触发此异常,但我需要用新项目替换旧项目。我怎样才能做到这一点 ?也许要创建 countNumberOfEachCharacter HashMap 的副本,并遍历原始 HashMap 以从副本 HashMap 中删除项目?
countNumberOfEachCharacter = new HashMap<Character,Character>();
if (countNumberOfEachCharacter.containsKey(word.charAt(i))) {
System.out.println("This character already exists");
for (Iterator it = countNumberOfEachCharacter.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
Object key = entry.getKey();
Object value = entry.getValue();
if (key.equals(word.charAt(i))) {
int toIncrease = Integer.parseInt(value.toString());
toIncrease++;
System.out.println("key "+key);
System.out.println("increased "+toIncrease);
countNumberOfEachCharacter.remove(word.charAt(i));
char c = Character.forDigit(toIncrease, 10);
countNumberOfEachCharacter.put(word.charAt(i),c);
}
}
}
else {
System.out.println("First time found this character");
char c = Character.forDigit(1, 10);
countNumberOfEachCharacter.put(word.charAt(i),c);
System.out.println("Stored "+word.charAt(i)+" with count "+c);
}
【问题讨论】:
-
请花点时间使问题中的代码更具可读性。
-
@Eng.Fouad 这不会解决问题,因为没有并发访问。他只是在迭代它并删除元素。
-
这实际上可能是我见过的最糟糕的代码:您正在使用
Character在地图中存储一个数字,然后使用Integer.parseInt(Character.toString()),递增它,然后保存Character.forDigit(Integer, 10)回到地图中。你喜欢疼痛还是什么?只需存储一个Integer!