2014-07-24 18 views
24

Anhand eines Beispiels:Wie durchläuft man eine ArrayList von Objekten der ArrayList von Objekten?

Let sagen, dass ich eine Klasse Anruf Gun haben. Ich habe einen anderen Klassenanruf Bullet.

Klasse Gun hat eine ArrayList von Bullet.

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

wir durch die Arraylist von Gun als solche iterieren einfach:

durch die Arraylist von Gun ..instead, dies zu tun iterieren

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

Jetzt will ich iterieren und drucken Sie alle Bullet von meinem 3. Gun Objekt aus:

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)); 

Nun ist meine Frage: Anstatt die herkömmliche for-Schleife zu verwenden, wie drucke ich die Liste der Waffe Objekte mit der ArrayList-Iteration?

+2

Warum denken Sie, gibt es einen Unterschied zwischen Ihrem Fall? Solange Ihre Klasse 'Iterable' implementiert (und wir wissen, dass' List' dies tut), können Sie eine 'for-each' Schleife verwenden. –

+0

Für wen unten diese Frage gewählt haben, sorge dafür, einen Grund hier fallen zu lassen? Ich habe SO überprüft und niemand hat das vorher gefragt. Ich hoffe, Sie können Ihren Grund dafür rechtfertigen, dass Sie mich abstimmen. Vielen Dank. – user3437460

+1

Für jede Art von Seelen da draußen, wenn Sie denken, dass meine Frage in Ordnung ist, geben Sie mir bitte eine Stimme, um diese ungerechtfertigte Abstimmung nach unten umzukehren. Vielen Dank. – user3437460

Antwort

20

Sie wollen das gleiche Muster folgen wie zuvor:

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

In diesem Fall wäre es:

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

Sie gaben mir genau das, wonach ich fragte. Ich habe es versucht und es funktioniert. Danke für alle, die eine Antwort geliefert haben. – user3437460

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

Eine Zeile Code zu schreiben und dann nichts zu erklären ist eine schreckliche Sache. –

+1

Ernsthaft? Ich dachte, dass eine Zeile eines Codes normalerweise keine Erklärung benötigt. Vor allem, wenn die Person, die die Frage selbst gestellt hat, schrieb: "for (Gun g: gunList) System.out.println (g);" –

3

Edit:

Nun, er bearbeitet seinen Posten .

Wenn ein Objekt Iterable erbt, haben Sie die Möglichkeit gegeben, die für-jede Schleife als solche zu verwenden:

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

Also in Ihrem Fall wollen, wenn Sie Ihre Waffen und ihre Bullets aktualisieren:

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 
    } 
} 

zuerst Ihr drittes Gun Objekt erhalten:

Gun g = gunList.get(2); 

dann über die dritte Pistole Kugeln durchlaufen:

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

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

Wir können eine verschachtelte Schleife tun, um alle Elemente der Elemente in Ihrer Liste zu besuchen:

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

Wenn Java8 mit, es würde einfacher sein und nur einen einzigen Liner.

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

Oder sogar 'gunList.get (2) .getBullets(). ForEach (System.out :: println);'. –

Verwandte Themen