2012-02-11 29 views
5

tôi muốn làm một cái gì đó tương tự như thisSửa Java ArrayList trong khi iterating trên nó

Tuy nhiên, tôi không muốn các yếu tố bổ sung để được lặp kết thúc. Về cơ bản tôi có một danh sách mảng cơ bản, và tôi trả về một trình lặp trên danh sách mảng. Trong khi lặp lại bằng cách sử dụng trình lặp đó, tôi muốn thêm các phần tử vào danh sách mảng ban đầu. Làm thế nào để tôi làm điều này?

EDIT: Vấn đề với điều này là tôi cần các đối tượng trong trình lặp được sửa đổi bởi mã lặp. Tôi không nghĩ rằng nhân bản danh sách mảng sẽ hoạt động ...

EDIT2: Đây là phiên bản rút gọn của mã của tôi.

public class Map { 
    // a bunch of code 
    private ArrayList<Robot> robots; 

    public Iterator<Robot> getRobots() { 
      return robots.iterator(); 
    } 

    public void buildNewRobot(params) { 
      if(bunchOfConditions) 
       robots.add(new Robot(otherParams); 
    } 

    // a bunch more code 
} 

Và đây là bản đồ đang được sử dụng trong một lớp khác.

for(Iterator<Robot> it = map.iterator(); it.hasNext();){ 
    Robot r = it.next(); 
    // a bunch of stuff here 
    // some of this code modifies Robot r 

    if(condition) 
     map.buildNewRobot(params); 
} 
+1

sẽ rất hữu ích nếu bạn cung cấp mã có liên quan – ggreiner

+0

Đã thêm mã. Xin lỗi vì đã bỏ qua nó. – BlackSheep

Trả lời

5

Bạn có thể tạo bản sao danh sách và lặp lại bản sao và thêm dữ liệu vào bản sao cũ. Vấn đề là bạn sẽ không lặp qua các itens mới.

+0

bit công việc nhiều hơn, nhưng bạn có thể giữ một biến từ true đến false, khi không có thay đổi, f.e. trong khi (Thay đổi) => tạo bản sao, đặt thay đổi thành false, thực hiện quy trình, nếu có gì đó được thêm hoặc thay đổi, bạn thay đổi thành đúng, nếu không quy trình sẽ kết thúc, – Jonathan

+0

Đây có thể là cách sạch và an toàn nhất để xử lý thành viên của một danh sách mảng trong khi lặp lại. Tôi đã sử dụng kỹ thuật này và thấy sự nhất quán – Steer360

0

Nó có thể gây hại cho bạn.

ArraList<E> a = new ArrayList<E>(); 
Iteratore<E> i = a.iterator(); 
loop(check condition){ 
    if(satisfied){ 
     a.add(E e); 
    } 
} 
Các vấn đề liên quan