Set<String> tempSet = new HashSet<String>();
for (Map.Entry<String, String> entry : map.entrySet()) {
String orginalKeys = entry.getKey();
System.out.println(orginalKeys);
String newKey = orginalKeys.replace('.','/');
if (!newKey.equals(orginalKeys)) {
map.put(newKey, entry.getValue());
tempSet.add(orginalKeys);
map.remove(orginalKeys);
}
}
System.out.println(map);
这只替换了一个键,但我想用上面的出现替换所有键。我要去的错误是什么?
答案 0 :(得分:3)
我发现此代码没有问题。假设您的地图有多个匹配关键字的密钥,例如包含至少一个点(.
),应该使用从原始键中获取的值创建多个新键,并且应该删除多个原始键。
另一种方法:只需创建一个新地图并删除旧地图:
Map<String, String> newMap = new HashMap<String, String>();
for (Map.Entry<String, String> entry : map.entrySet())
newMap.put(entry.getKey().replace('.', '/'), entry.getValue());
map = newMap;
(如果您仍然需要tempSet
,请修改for循环中的代码)
答案 1 :(得分:2)
这只替换了一个键,但我想用上面的出现替换所有键。我要去的错误是什么?
通常我希望您的代码能够提供ConcurrentModificationException
。问题是您在迭代时正在修改地图。
“所有类的”集合视图方法“返回的迭代器都是快速失败的:如果在创建迭代器之后的任何时候对映射进行结构修改,除了通过迭代器自己的remove方法之外,迭代器因此,在并发修改的情况下,迭代器会快速而干净地失败,而不是在未来的未确定时间冒着任意的,非确定性的行为。“
将会抛出ConcurrentModificationException
。“请注意,迭代器的快速失败行为无法得到保证,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬保证。快速失败的迭代器抛出
ConcurrentModificationException
因此,编写依赖于此异常的程序以确保其正确性是错误的:迭代器的快速失败行为应仅用于检测错误。“
如果您在your previous question的答案中查看我的解决方案和@Colin Herbert的解决方案,您将看到我们在单独的数据结构中仔细记录需要更改的内容。只有在迭代完成后,我们才会对原始Map进行更改。这很关键。没有它,解决方案就无法运作。
答案 2 :(得分:1)
我不确定你是否可以在迭代时修改地图。尝试先收集要在列表中更改的条目,然后再循环遍历该列表以进行更改。
答案 3 :(得分:1)
理想情况下,当您迭代map.entrySet()时,此代码应抛出java.util.ConcurrentModificationException,同时更新map.put(newKey,entry.getValue());
如前所述,您可以创建一个新的临时地图并替换为原始地图
或 你可以在列表中获取密钥并迭代列表
String[] keyArray = map.keySet().toArray(new String[map.size()]);
Set<String> tempSet = new HashSet<String>();
for (String orginalKeys : keyArray) {
System.out.println(orginalKeys);
String newKey = orginalKeys.replace('.', '/');
if (!newKey.equals(orginalKeys)) {
map.put(newKey, map.get(orginalKeys));
tempSet.add(orginalKeys);
map.remove(orginalKeys);
}
}
System.out.println(map);