gpt4 book ai didi

java - 有没有办法用java就地更改 map 的键?

转载 作者:行者123 更新时间:2023-12-01 11:38:22 24 4
gpt4 key购买 nike

我想更改 map 的特定原始键名称的键,并且我想找到一种方法来就地修改它,这样它就不会在执行此操作时复制内容。我已经知道我只能通过使用迭代器进行迭代来删除映射的条目。但是当我在迭代 map 时将东西放回 map 时。这是不可能的。无论如何,我将在下面放置我的示例代码,希望有人能给我一个提示。

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)
<小时/>

编辑

我知道导致此问题的原因,但我想找到“最佳”或替代方法来做到这一点。

最佳答案

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

关于java - 有没有办法用java就地更改 map 的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29769396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com