2015-04-21 51 views
0

我想更改地圖的特定原始關鍵字名稱的關鍵字,並且我想找到一種方法對其進行恰當的修改,以便在做這件事時不會複製它。我已經知道我只能通過迭代使用而不是 a Iterator來刪除地圖條目。但是當我重複地圖的時候把東西放回地圖。它不能做到。無論如何,我會把我的示例代碼放在下面,希望有人能給我一些提示。有沒有辦法使用java就地更改地圖的鍵?

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) 

編輯

我知道是什麼導致這個問題,但我想找到「最佳」或替代的方式來做到這一點。

+4

除了通過迭代器以外的任何修改都會使迭代器失效。在迭代完成後使用putAll()合併更改,收集要重定位到新地圖的條目。 – Durandal

+0

從地圖上刪除值時,如果迭代它,將導致此異常 – Lucky

+0

使用https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html? –

回答

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); 
    } 
} 
+0

似乎這是迄今爲止最好的選擇,我會接受這一點,這也要歸功於@Durandal。 – armnotstrong

相關問題