我想寫這樣的代碼 -如何在迭代時刪除元素並將其添加到TreeMap中?
for (Map.Entry<Long, Integer> e : map.entrySet()){
map.remove(k);
map.put(x, value);
}
但我得到java.util.ConcurrentModificationException
我試圖用Iterator
還,但我得到了同樣的Exception
我想寫這樣的代碼 -如何在迭代時刪除元素並將其添加到TreeMap中?
for (Map.Entry<Long, Integer> e : map.entrySet()){
map.remove(k);
map.put(x, value);
}
但我得到java.util.ConcurrentModificationException
我試圖用Iterator
還,但我得到了同樣的Exception
Explaintion爲什麼會造成ConcurrentModificationException
map.remove(k);
map.put(x, value);
指針另一個臨時地圖
for-each循環還內部創建entrySet
的map
的迭代器。在迭代地圖時,通過將該值再次放入導致此ConcurrentModificationException
的地圖(map.put(x,value)
)中,修改了地圖的結構。
它甚至好於documentation解釋 -
的迭代器由所有此類的返回「collection視圖 方法」是快速失敗的:如果地圖是在結構上任何 一次迭代之後修改除了通過 迭代器自己的remove方法以外的任何方式創建,迭代器將拋出 ConcurrentModificationException。因此,面對併發的修改,迭代器很快並且乾淨地失敗,而不是冒着在將來確定的時間 處的任意的,不確定的行爲冒險。
如何解決這個 -
稍後必須改改這個地圖的結構,而迭代,你可以插入這個值,比如保持一個臨時的地圖,並添加此一次迭代完成了他工作。
Map<Long, Integer> tempMap = new HashMap<>();
for (Map.Entry<Long, Integer> e : map.entrySet()){
map.remove(k);
tempMap.put(x, value);
}
map.putApp(tempMap);
您必須創建一個使用副本地圖的副本構造函數。現在迭代1並修改第二張地圖。 我假設你不需要迭代新增值,因爲它不會有多大意義。
您可以通過創建副本來實現您的任務,因爲這兩個鍵的鍵值將保持不變。
編輯:
我不認爲這是一個好主意,新添加的元素進行迭代,以一個HashMap。如果你檢查Iterator提供的API,那麼你會發現只有刪除方法,沒有添加方法。這背後有一個原因,你可以檢查javadoc。 現在來談談如何迭代新添加的元素。
HashMap
的副本。所以你將迭代一個並修改另一個Map
。Map
中的元素,我想使用ListIterator
這[這是不同於正常Iterator
]。keyset
並使用ArrayList(Collection<? extends E> c)
將其轉換爲列表。List
中獲得ListIterator
,並在ListIterator
以及Map2中添加,刪除元素[請注意您需要添加,在ListIterator
和Map2中刪除]。不,我需要迭代這個新值 新增加的值將大於當前的一個 所以我需要遍歷它們 –
看到我的編輯。使用新添加的步驟,您可以執行添加和刪除兩者。 – Lokesh
因爲你不能那樣做。
一個簡單的解決方案是使用你把你想要的值,最後切換與原來的(即地圖= newMap)
我需要迭代新增的值 –
然後創建一個while循環,並繼續這樣做直到完成。 – Ahmad
遍歷一個副本,你可以添加/刪除就好了:
for (Map.Entry<Long, Integer> e : new LinkedHashMap<Long, Integer>(map).entrySet()){
map.remove(k);
map.put(x, value);
}
它甚至不是任何更多的代碼,因爲複製IMS在線通過拷貝構造函數取得。 LinkedHashMap
被選擇來保存迭代次序(如果有的話)。
下面給出了一個用於從地圖中刪除元素的示例代碼片段。
for(Iterator<Map.Entry<Long, Integer>> it = map.entrySet().iterator();it.next();)
{
Map.Entry<String, String> entry = it.next();
if(//some logic)
it.remove();
}
如果你的代碼涉及到很多的添加和刪除,你可能只是想使用的ConcurrentHashMap。 ConcurrentHashMap
@ZouZou我爲此搜索了一下,發現這個問題放在第一位。谷歌是不夠的,內容也需要:-) – peterh
可以使用迭代器的代碼。上面的代碼肯定會給你一個併發修改異常。您正在遍歷鍵集以及同時修改地圖。這是一場災難。 – SamDJava
以下示例代碼添加了一個答案。 – SamDJava