我試圖寫一個非常簡單的方法來刪除一個LinkedList重複:爲什麼在迭代器上調用remove()會給出ConcurrentModificationException?
我嘗試這樣做,而無需使用額外的緩衝,所以我保持鏈表上兩個迭代器,一個不正常的迭代和另一遍歷所有先前的節點來檢查dupe(如CareerCup中所示);然而,編譯器告訴我有一個CME即使我打電話itr1.remove():
public static void RemoveWithoutBuffer(LinkedList l) {
ListIterator itr1 = l.listIterator();
int count1 = 0;
int count2 = 0;
while (itr1.hasNext()) {
Object next = itr1.next();
count1++;
count2 = 0;
ListIterator itr2 = l.listIterator();
while (itr2.hasNext()) {
count2++;
if (count2 == count1)
break;
if (itr2.next() == next){
itr1.remove();
}
}
}
}
這個問題用一個HashSet的援助的另一個更簡單的解決方案易於如下,也不例外報道:
public static void Remove(LinkedList l) {
HashSet set = new HashSet();
ListIterator itr = l.listIterator();
while (itr.hasNext()) {
Object next = itr.next();
if (set.contains(next))
itr.remove();
else
set.add(next);
}
}
是因爲當我通過itr2迭代時,我無法修改itr1嗎?有沒有辦法來解決這個問題?感謝你們。
謝謝。這個解決方案非常好,但仍然佔用一些額外的空間,但我相信它比使用hashSet節省更多的空間。感謝您的鏈接了。 – Superziyi 2012-04-02 03:44:30
如果涉及空間,可以將元素標記爲已刪除(即對列表設置爲空,或將特殊鍵與「isRemoved」屬性集合在一起並稍後執行實際刪除)。 – 2012-04-02 03:48:50