2016-11-30 3 views
0

Nehmen wir an, wir haben eine ArrayList von Katzen.Kann ich eine reguläre for-Schleife verwenden, um bestimmte Objekte aus einer ArrayList zu löschen?

Dies ist unsere Katze:

public class Cat{ 
    String color; 
    int age; 
    public Cat(String color, int age){ 
     this.color = color; 
     this.age = age; 
    } 
} 

Wir haben eine Katze und jede Katze eine Farbe hat. An anderer Stelle in unserem Code haben wir folgendes:

ArrayList<Cat>cats = new ArrayList<Cat>(); 
cats.add(new Cat("white",5); 
cats.add(new Cat("black",6); 
cats.add(new Cat("orange",10); 
cats.add(new Cat("gray",3); 
System.out.println(cats.size()); prints out 4 

So jetzt sind Katzen ArrayList hat 4 Katzen drin. Was, wenn ich alle Katzen entfernen möchte, die über 5 Jahre alt sind, sollte ich nicht in der Lage sein, folgendes zu tun?

for(int index = 0; index<cats.size(); index++){ 
    if(cats.get(index).age > 5){ 
     cats.remove(index); 
    } 
} 

Jetzt danach läuft, drucke ich Arraylist die Größe der Katzen aus und es sagt, 3, obwohl es 3 Katzen und ein verlassen entfernen sollte.

Also, sollte das nicht funktionieren? Ich verstehe nicht, warum es nicht ging. Welche anderen Möglichkeiten gibt es, um Objekte mit bestimmten Werten aus einer Liste/einem Array zu entfernen?

+0

Siehe den obigen Link. tl; dr: Benutze einen Iterator. –

+0

@TimBiegeleisen Was hat das mit einer CoMod-Ausnahme zu tun? – shmosel

+0

Nein, du kannst es nicht so machen. Denken Sie darüber nach: Wenn Sie die Elemente iterieren und eines in der Mitte der Schleife löschen, ändert sich der Index der nächsten Elemente und überspringt daher jedes Mal ein Element. Was es tut ist: der erste wird übersprungen, weil das Alter 5 ist. Der zweite wird gelöscht, der Index ist 1, Größe() ist 3 nach dem Löschen. Also im nächsten Schritt ist Index 2, aber das ist jetzt "grau" und nicht orange. Grau ist 3, also nicht gelöscht. Danach ist index = 3 und size() = 3, so dass die Schleife beendet wird und Sie 3 Elemente haben: weiß, orange und grau. –

Antwort

0

Das Problem mit Ihrem Beispiel ist, dass Sie ein Element aus dem Array Katzen entfernen, aber nicht die neue Größe berücksichtigen. Was ist passiert, ist dies:

  • i = 0 Cat "weiß" ist, ist das Alter 5, also nichts zu tun
  • i = 1. Katze ist "schwarz", ist das Alter 6. entfernte Element am Index 1 (jetzt ist Größe 3 und Index 1 "orange")
  • i = 2. Katze ist "grau", ist das Alter 3, also nichts
  • i = 3, zu tun, was ist nicht weniger als die Größe der Katzen (die 3 ist), also nicht für Schleife wieder eingeben

Wenn Sie sicher sind Wenn Sie eine for-Schleife verwenden möchten, ist die einfachste Lösung, den Index jedes Mal um eins zu dekrementieren, wenn Sie ein Element entfernen:

+1

Wow, das ist eine schmutzige Lösung. Warum nicht ein 'for (int index = cats.Größe() - 1; Index> = 0; index--) {} 'Schleife stattdessen? Es ist mindestens ein bisschen sauberer ... –

+0

"i = 1. Katze ist" schwarz ", Alter ist 6. Entfernen Sie Artikel bei Index 2 (jetzt Größe ist 3 und Index 1 ist" orange ")" Meinst du Remove item bei Index 1? –

+0

@Lupinity Dies ist möglicherweise nicht der beste Ansatz, erfordert jedoch die geringste Änderung des OP-Codes. – shmosel

Verwandte Themen