有没有办法用java改变地图的键?

时间:2015-04-21 10:19:49

标签: java dictionary

我想更改地图的特定原始键名称的键,我想找到一种方法来就地修改它,这样它就不会在执行时复制它。我已经知道我只能使用 a Iterator通过迭代删除地图条目。但是当我在迭代地图时将东西放回地图时。它无法完成。无论如何,我会把我的示例代码放在下面,希望有人可以给我一些这样的暗示。

public class TestMapModify {
    public static void main(String[] argvs){
        Map<String, Object> m = new HashMap<String, Object>();
        m.put("a",1);
        m.put("b",2);
        for(Iterator<Map.Entry<String, Object>> it = m.entrySet().iterator();it.hasNext();){
            Map.Entry<String, Object> entry = it.next();
            if(entry.getKey().equals("a")){
                m.put("c", entry.getValue());
                it.remove();
            }
        }
        System.out.println(m);
    }
}

在上面的代码中,我想将密钥"a"更改为"c"并保持其值不变。但是这段代码会给出一个例外:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.remove(HashMap.java:944)
    at me.armnotstrong.TestMapModify.main(TestMapModify.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

修改

我知道造成这个问题的原因,但我想找到最好的&#34;或其他方式。

1 个答案:

答案 0 :(得分:1)

@Durandal已经回答了这个问题。我之前没有读过。

您可以将新值放入另一个地图,然后在迭代后将其添加到现有地图。

public class TestMapModify {
    public static void main(String[] argvs) {
        Map<String, Object> m = new HashMap<String, Object>();
        Map<String, Object> anotherMap = new HashMap<String, Object>();

        m.put("a", 1);
        m.put("b", 2);
        for (Iterator<Map.Entry<String, Object>> it = m.entrySet().iterator(); it.hasNext();) {
            Map.Entry<String, Object> entry = it.next();
            if (entry.getKey().equals("a")) {
                anotherMap.put("c", entry.getValue());
                it.remove();
            }
        }
        m.putAll(anotherMap);
        System.out.println(m);
    }
}