簡體   English   中英

Java-HashMap迭代-異常

[英]Java - HashMap Iteration - Exception

我想像這樣迭代HashMap:

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            map.replace(entry.getKey(), entry.getValue()-1);
            if (entry.getValue() == 0) {
                map.remove(entry.getKey(), 0);
            }
        }

這以異常結束:java.util.ConcurrentModificationException

有什么辦法嗎?

親切的問候

 Iterator<Map.Entry<Integer, Integer>> entryItr = map.entrySet().iterator();
 while (entryItr.hasNext()) {
   Map.Entry<Integer, Integer> entry = entryItr.next();
   if (entry.getValue() > 1) {
     entry.setValue(entry.getValue() - 1);
   } else {
     entryItr.remove();
   }
 }

您正在遍歷地圖時從地圖中刪除項目。 這就是導致異常的原因。

為了弄清楚為什么這樣做是直覺的:如果地圖包含三個項目,並且在第一次迭代中刪除了第一項目,那么下一個項目應該是第二個項目還是第三個項目? 也就是說,迭代是否應該繼續進行,好像已刪除的項目仍在那兒一樣? 如果是這樣,怎么辦?

您可以通過在地圖上使用迭代器來解決此問題,該迭代器可以安全地遍歷地圖的每個元素。

您必須Set不使用Iterator情況下從現有Set移除元素,否則它將引發ConcurrentModificationException

因此,將值放置到new Map對象if(value-1 !=0) ,如下所示:

        Map<Integer, Integer> map = new HashMap<>();
        Map<Integer, Integer> newMap = new HashMap<>();
        Iterator<Integer> iterator =map.keySet().iterator();
        while(iterator.hasNext()) {
            int key = iterator.next();
            int value = map.get(key);
            if(value-1 !=0) {
                newMap.put(key, value-1);
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM