2012-06-21 24 views
5

Tôi sẽ sử dụng trình lặp để lặp qua một tập hợp các đối tượng trong Java. Tôi là một chút bối rối về việc sử dụng một Iterator tuy nhiên (được sử dụng để sử dụng cho mỗi vòng lặp). giả sử tôi có mã như sau:Trong khi lặp qua một tập hợp các đối tượng Java - làm cách nào tôi có thể thay đổi đối tượng hiện tại?

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

Tôi tạo đối tượng mới và sau đó thay đổi các trường bên trong đối tượng. Kế hoạch của tôi là sau đó thiết lập đối tượng ban đầu mà tôi đã tạo thành trình lặp ra bằng một Danh sách đối tượng này mà tôi tạo (Danh sách không được hiển thị ở trên, nhưng tôi đã chỉ ra rằng mình sẽ cần nó).

Nhưng sẽ dễ dàng hơn nhiều nếu tôi không phải tạo một đối tượng mới để thực hiện tất cả điều này. Có cách nào tôi có thể nhận được các đối tượng hiện tại và đột biến đó?

+0

từ ngữ của bạn là khó hiểu .... mã của bạn có chức năng giống hệt nhau để trả lời chấp nhận của bạn. Trong cả hai trường hợp, các đối tượng duy nhất được tạo ra là các ArrayLists, và các đối tượng đó sẽ khác nhau cho mỗi cá thể của Tổ chức. Đây là con đường để đi! –

+1

Tôi bối rối, tôi đang tạo trên đối tượng Tổ chức và thiết lập nó bằng lần lặp tiếp theo. Tôi đoán vì đó là biến tham chiếu, tôi vẫn đang biến đổi cùng một đối tượng bộ nhớ vật lý ... – SoftwareSavant

+0

Có sự khác biệt giữa việc khai báo biến và tạo đối tượng. –

Trả lời

4

Hãy thử điều này:

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

+1 Đây là con đường để đi. Sử dụng vòng lặp foreach, bởi vì bạn không sửa đổi 'orgs', chỉ cần sửa đổi các phần tử * của *' orgs'. – Bohemian

+0

Tôi đoán đó là những gì tôi nên làm ... Tôi đã cố gắng để mở rộng repotoire của tôi một chút, nhưng tốt nhất để làm những gì tôi có thể. – SoftwareSavant

3

Nếu trình vòng lặp của bạn lặp qua một phiên bản List hoặc Queue thì có ít hạn chế hơn. Miễn là bạn không thay đổi cấu trúc của danh sách, bạn có thể làm bất cứ điều gì bạn muốn với đối tượng trả về bởi Iterator.next(). Tất nhiên, lớp của đối tượng cụ thể đó sẽ cho phép nó được sửa đổi, nhưng tôi cho rằng bạn có thể thêm mã cần thiết ...

Mặt khác, sửa đổi cấu trúc danh sách duy nhất được phép mà không làm mất hiệu lực Iterator đối tượng, là để loại bỏ các phần tử hiện tại bằng cách sử dụng Iterator.remove(), trong đó, tình cờ, là một hoạt động tùy chọn. Nếu bạn cố gắng sửa đổi danh sách trực tiếp thì trình vòng lặp sẽ bị vô hiệu và bạn sẽ nhận được một ConcurrentModificationException lần sau khi bạn cố gắng sử dụng nó. Ngoài ra, nếu bạn đang lặp qua Set, bạn thường bị hạn chế nhiều hơn: tùy thuộc vào chi tiết thực tế Set thực hiện, bạn thường không thể sửa đổi các trường tùy ý trong đối tượng của bạn. Ví dụ, giá trị trả về bởi hashCode() không nên thay đổi khi một đối tượng đã được lắp vào một HashSet ...

Là một sidenote, for-each vòng trong Java là đường chỉ là cú pháp cho việc sử dụng một Iterator. Nếu bạn sẽ không sử dụng Iterator.remove(), chỉ cần sử dụng vòng lặp for-each thay vì trình lặp khám phá và được thực hiện với nó.

+0

Anh ta không nói anh ta có một 'Danh sách' (chỉ là anh ta có một 'Bộ sưu tập'), và thay đổi một đối tượng mà bạn đã lưu trữ trong một' Bộ' là rất xấu nếu bạn thay đổi một trường được sử dụng trong tính toán 'hashCode' (khi sử dụng' HashSet') hoặc tính toán 'Comparable' (khi sử dụng' TreeSet'). Làm như vậy sẽ phá vỡ ngữ nghĩa 'Set', vì giá trị có thể không còn được đặt trong tập hợp. –

+0

@MarkPeters: đã đồng ý, tôi cho rằng OP đã sử dụng Danh sách, vì từ 'Set' không có trong câu hỏi. Tôi sẽ cập nhật câu trả lời của tôi ... – thkala

Các vấn đề liên quan