2016-07-29 7 views
1

Wie kann ich bestimmte Rechtecke aus dieser ArrayList entfernen? Ich möchte die Rechtecke entfernen, die höher sind als 100.Entfernen Sie bestimmte Rechtecke aus einer ArrayList

ArrayList <Rectangle> array = new ArrayList <Rectangle>(); 
for (int i = 0; i<array.size(); i++) { 
    if (array.get(i).getHeight() < 100) { 
      array.remove(i); 
    } 
} 

Dieser Code funktioniert nicht! Wenn Sie sich um die Elemente kümmern, gibt es weniger Rechtecke, aber es gibt immer noch solche, die höher als 100 sind!

+4

Ihre 'if' Bedingung falsch ist, sollte es sein' array.get (i) .getHeight()> 100' – Abubakkar

+1

Sie ändern können '<' to this '>' –

+0

hinzufügen System.out .println an verschiedenen Stellen und finde heraus, was passiert :) – Teddy

Antwort

4

Was ist mit Java 8-Lösung?

array = array.stream().filter(r -> r.getHeight() <= 100).collect(Collectors.toList()); 

Es gibt ein neues List von Rectangle s, die als 100 höher sind.

+1

Ich nehme an, Sie wollten die resultierende Liste irgendwo zuweisen, sonst tut es nichts. –

+0

@PeterLawrey, Ja, sicher. Ich habe das Ergebnis der gleichen Variablen zugewiesen. Vielen Dank. – Andrew

+0

Danke! ARBEIT! – Liuk

2

Korrigieren Sie Ihre wenn Bedingungen wie unter

ArrayList <Rectangle> array = new ArrayList <Rectangle>(); 
for (int i = 0; i<array.size(); i++) { 
    if (array.get(i).getHeight() > 100) { 
      array.remove(i--); // "--" means go back one step 
    } 
} 
+3

Hinweis: Sie müssen 'array.remove (i -);' als Index des nächsten Eintrags geändert haben. –

+0

Eine for-each-Schleife ist schwierig zu verwenden, wenn Sie die Sammlung ändern. –

+1

ja Peter ich habe das vergessen ... –

-1

Sie können wie folgt tun,

ArrayList <Rectangle> array = new ArrayList <Rectangle>(); 
for (Rectangle rec : arrays) { 
    if (rec.getHeight() > 100) { 
      array.remove(i); 
    } 
} 
+0

Wo wird 'i' deklariert? – jsheeran

+0

Ich habe den Code @jsheeran aktualisiert. Bitte schau es dir an. Vielen Dank. –

4

Abgesehen von der einfachen Tippfehler von > vs <:

Wenn Sie die Liste nach vorne und entfernen Sie Elemente von Index laufen, werden Sie Elemente zu kurz kommen, wenn es sind zwei benachbarte Gegenstände, die die Kriterien zum Entfernen erfüllen.

Entweder:

  • Iterate die Liste in umgekehrter Reihenfolge:

    for (int i = array.size() - 1; i >= 0; i--) { 
    
  • Decrement i nach einem Elemente zu entfernen (in der Regel nicht empfohlen, da es verwirrend ist eine der for-Schleife Iterationsvariable ändern in der Schleifenkörper):

    array.remove(i--); 
    
  • Verwenden Sie ein Iterator:

    Iterator<Rectangle> it = array.iterator(); 
    while (it.hasNext()) { 
        Rectangle r = it.next(); 
        if (some condition) { 
        it.remove(); 
        } 
    } 
    
+1

@Whoever es war - danke für den Schnitt. Ich habe das "Edit ..." - Bit am unteren Rand entfernt, da es sich um einen direkten Tippfehler handelte. –