2014-04-25 56 views
0

我想迭代(或使用每個循環)在鏈接列表類,並能夠更改項目(找到時)爲傳入參數。更改列表,同時迭代或使用每個循環

for(Item n : items) 
{ 
    if (n.getKey().equals(key)) 
    { 
     n = new Item(key, value); 
    } 
} 

數據的這種改變是工作還是臨時的(只有當激活記錄被刪除時纔會丟失)?

+0

嘗試使用基本的for循環'for(int i = 0; i

+0

有列表不保證線性時間,迭代器保證 – jfre9193

回答

0

無法遍歷集合,並對其進行修改。你將永遠得到java.util.ConcurrentModificationException。首先,您需要使用迭代器來刪除項目。然後,您可以使用第二個列表來存儲要添加的數據。

給你一個例子:

LinkedList<String> linkedList = new LinkedList<String>(); 

     linkedList.add("This"); 
     linkedList.add("is"); 
     linkedList.add("an"); 
     linkedList.add("test"); 

     LinkedList<String> temp = new LinkedList<String>(); 

     for (Iterator<String> iterator = linkedList.iterator(); iterator.hasNext();) { 
      String string = (String) iterator.next(); 

      if(string.equals("an")) { 
       iterator.remove(); 

       temp.add("a"); 
      } 
     } 

     linkedList.addAll(temp); 

您可以撥打iterator.remove()到savely從列表中刪除當前項目。

+0

不會拋出異常嗎?還是迭代器死了,循環終止? – jfre9193

+0

不會有任何事情發生,它的工作原理完美無瑕;) - 這將取代「a」作爲「a」 – Marcinek

+0

不能保證你會得到'ConcurrentModificationException'。從它的JavaDocs「請注意,無法保證故障快速行爲,因爲一般來說,不可能在存在非同步併發修改的情況下做出任何硬性保證,故障快速操作會盡最大努力拋出ConcurrentModificationException,因此它編寫依賴於此異常的程序的正確性會導致錯誤:ConcurrentModificationException應僅用於檢測錯誤。「 –

0

您正在使用快速枚舉,它保護您正在迭代的列表。如果您想更改列表中的數據,則需要使用傳統的for循環。

基本上枚舉的工作原理是它使數組在代碼塊中只讀,因爲您無法訪問迭代的整數。

你可以這樣做:

for(int i = 0; i < items.length; i++) 
{ 
    if (n.getKey().equals(key)) 
    { 
     items[i] = new Item(key, value); 
    } 
} 
+0

但我沒有想要使用這個是我正在使用一個鏈接列表類,它不能通過.get()或.replace()方法在常量時間內訪問。 – jfre9193

+0

但是難道你不能做item [i] .getKey()。equals(key))? –

+0

這些項目是一個LinkedList對象 – jfre9193

0

檢查iterator.Iterator的語法有兩個方法hasnext和next。