2012-06-21 134 views
5

我將使用迭代器遍歷Java中的一組對象。然而,我對使用Iterator有點困惑(用於每個循環)。讓說我有這樣的代碼:在對Java對象集合進行迭代時 - 如何更改當前對象?

Iterator<Organization> orgIter = orgs.iterator(); 
while (orgIter.hasNext()) { 
    Organization orgObj = orgIter.next(); 
    orgObj.setChildOrgsTree(generateOrgChildTree(orgObj, new ArrayList<Organization>())); 
} 

我創建了一個新的對象,然後更改對象中的字段。我的計劃是將我創建的原始對象設置爲等於我創建的這個對象的列表(List不在上面顯示,但我只是想知道我需要它)。

但是如果我不需要創建一個新的對象來完成所有這些,它會容易得多。有沒有一種方法可以獲取當前對象並進行變異?

+0

你的措辭混淆....你的代碼是功能上等同於您接受的答案。在這兩種情況下,唯一創建的對象是ArrayLists,對於每個組織實例它們都是不同的。這是要走的路! –

+1

我很困惑,我在組織對象上創建並將其設置爲等於下一次迭代。我猜想,因爲這是一個參考變量,我仍然在變異同一個物理內存對象... – SoftwareSavant

+0

聲明一個變量和創建一個對象是有區別的。 –

回答

4

試試這個:

for(Organization org : orgs) 
    org.setChildOrgsTree(generateOrgChildTree(org, new ArrayList<Organization>()); 
+0

+1這是要走的路。使用foreach循環,因爲你沒有修改'orgs',只是修改*'orgs'的元素*。 – Bohemian

+0

我想這就是我應該做的......我試圖擴大我的repotoire一點點,但最好盡我所能。 – SoftwareSavant

3

如果您的迭代器遍歷ListQueue實例,則限制較少。只要你不改變列表的結構,你可以用Iterator.next()返回的對象做任何你想做的事情。當然,該特定對象的類應該允許它被修改,但我認爲你可以添加必要的代碼...

另一方面,只允許在不使Iterator無效的情況下進行列表結構修改對象,是使用Iterator.remove()刪除當前元素,順便說一下,這是一個可選操作。如果您嘗試直接修改列表,則迭代器將失效,下次嘗試使用它時您將獲得​​。

此外,如果您正在迭代Set,則通常會受到更多限制:根據實際的Set實施的詳細信息,您通常無法修改對象中的任意字段。例如,通過hashCode()返回的值應該不會改變,一旦有物體在HashSet插入...

一點題外話,for-each循環在Java中是使用Iterator只是語法糖。如果您不打算使用Iterator.remove(),則只需使用for-each循環而不是explicity迭代器並完成它。

+0

雖然他沒有說他有一個'List'(只是他有一個'Collection'),並且如果你改變了一個在'Set'中使用的字段,那麼改變一個存儲在Set中的對象是非常糟糕的'hashCode'計算(當使用'HashSet'時)或'Comparable'計算(當使用'TreeSet'時)。這樣做會打破'Set'語義,因爲該值可能不再位於該集合中。 –

+0

@MarkPeters:同意了,我認爲OP使用的是List,因爲Set沒有在問題中。我會更新我的答案... – thkala

相關問題