2014-07-24 23 views
24

Sử dụng ví dụ:Làm thế nào để lặp qua một ArrayList của các đối tượng của ArrayList của các đối tượng?

Giả sử tôi có một cuộc gọi lớp Gun. Tôi có một cuộc gọi cấp lớp khác Bullet.

Lớp Gun có một ArrayList là Bullet.

Để lặp qua ArrayList của Gun ..instead để làm điều này:

ArrayList<Gun> gunList = new ArrayList<Gun>(); 
for (int x=0; x<gunList.size(); x++) 
    System.out.println(gunList.get(x)); 

Chúng tôi chỉ có thể lặp qua ArrayList của Gun như vậy:

for (Gun g: gunList) System.out.println(g); 

Bây giờ, tôi muốn lặp và in ra tất cả Bullet của đối tượng thứ 3 Gun của mình:

for (int x=0; x<gunList.get(2).getBullet().size(); x++) //getBullet is just an accessor method to return the arrayList of Bullet 
    System.out.println(gunList.get(2).getBullet().get(x)); 

Bây giờ câu hỏi của tôi là: Thay vì sử dụng vòng lặp thông thường, tôi làm cách nào để in danh sách các đối tượng súng bằng cách sử dụng phép lặp ArrayList?

+2

Tại sao bạn nghĩ có sự khác biệt giữa trường hợp quá của bạn? Miễn là lớp của bạn thực hiện 'Iterable' (và chúng ta biết rằng' List' hiện) bạn có thể sử dụng một vòng lặp 'for-each'. –

+0

Đối với những người bỏ phiếu bình chọn câu hỏi này, hãy quan tâm đến việc bỏ qua lý do tại đây? Tôi đã kiểm tra SO và không ai hỏi điều này trước đây. Tôi hy vọng bạn có thể biện minh cho lý do của bạn để bỏ phiếu bầu cho tôi. Cảm ơn. – user3437460

+1

Đối với bất kỳ linh hồn nào ngoài kia, nếu bạn nghĩ câu hỏi của tôi là ổn, vui lòng cho tôi một cuộc bỏ phiếu để đảo ngược cuộc bỏ phiếu không được điều chỉnh này. Cảm ơn bạn. – user3437460

Trả lời

20

Bạn muốn theo cùng một khuôn mẫu như trước:

for (Type curInstance: CollectionOf<Type>) { 
    // use currInstance 
} 

Trong trường hợp này sẽ là:

for (Bullet bullet : gunList.get(2).getBullet()) { 
    System.out.println(bullet); 
} 
+0

Bạn đã cho tôi chính xác những gì tôi yêu cầu. Tôi đã thử nó và nó hoạt động. Cảm ơn tất cả những người đã đóng góp câu trả lời. – user3437460

1
for (Bullet bullet : gunList.get(2).getBullet()) System.out.println(bullet); 
+0

Đăng một dòng mã và sau đó không giải thích bất cứ điều gì là một điều khủng khiếp để làm. –

+1

Nghiêm túc? Tôi nghĩ một dòng mã thường không cần giải thích. Đặc biệt là khi người hỏi câu hỏi mình đã viết: "cho (Gun g: gunList) System.out.println (g);" –

3

Edit:

Vâng, anh sửa bài của mình .

Nếu một đối tượng thừa hưởng Iterable, bạn có khả năng sử dụng cho-mỗi vòng lặp như vậy:

for(Object object : objectListVar) { 
    //code here 
} 

Vì vậy, trong trường hợp của bạn, nếu bạn muốn cập nhật Guns của bạn và Bullets của họ:

for(Gun g : guns) { 
    //invoke any methods of each gun 
    ArrayList<Bullet> bullets = g.getBullets() 
    for(Bullet b : bullets) { 
      System.out.println("X: " + b.getX() + ", Y: " + b.getY()); 
      //update, check for collisions, etc 
    } 
} 

Đầu tiên có được đối tượng Gun thứ ba của bạn:

Gun g = gunList.get(2); 

Sau đó lặp trên đạn súng thứ ba:

ArrayList<Bullet> bullets = g.getBullets(); 

for(Bullet b : bullets) { 
    //necessary code here 
} 
1

Chúng ta có thể làm một vòng lặp lồng nhau đến thăm tất cả các yếu tố của các yếu tố trong danh sách của bạn:

for (Gun g: gunList) { 
    System.out.print(g.toString() + "\n "); 
    for(Bullet b : g.getBullet() { 
     System.out.print(g);  
    } 
    System.out.println(); 
} 
0
int i = 0; // Counter used to determine when you're at the 3rd gun 
for (Gun g : gunList) { // For each gun in your list 
    System.out.println(g); // Print out the gun 
    if (i == 2) { // If you're at the third gun 
     ArrayList<Bullet> bullets = g.getBullet(); // Get the list of bullets in the gun 
     for (Bullet b : bullets) { // Then print every bullet 
      System.out.println(b); 
     } 
    i++; // Don't forget to increment your counter so you know you're at the next gun 
} 
5

Khi sử dụng Java8 nó sẽ dễ dàng hơn và một lớp lót duy nhất.

gunList.get(2).getBullets().forEach(n -> System.out.println(n)); 
+0

Hoặc thậm chí 'gunList.get (2) .getBullets(). ForEach (System.out :: println);'. –

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