[英]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.