我想更改地图的特定原始键名称的键,我想找到一种方法来就地修改它,这样它就不会在执行时复制它。我已经知道我只能使用 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;或其他方式。
答案 0 :(得分:1)
您可以将新值放入另一个地图,然后在迭代后将其添加到现有地图。
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);
}
}