替换以字符开头的hashmap中的所有键

时间:2010-10-04 12:08:58

标签: java

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);

这只替换了一个键,但我想用上面的出现替换所有键。我要去的错误是什么?

4 个答案:

答案 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。问题是您在迭代时正在修改地图。

javadoc for HashMap说:

  

“所有类的”集合视图方法“返回的迭代器都是快速失败的:如果在创建迭代器之后的任何时候对映射进行结构修改,除了通过迭代器自己的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);