2016-04-06 8 views
0

Ich habe den folgenden Code abgeklopft, wo ich alle '0' aus dem Array p4 entfernen möchte. Dieses Array wird in eine Arraylist mengeOfColorPoints eingefügt. Die for-Schleife sollte bis zum Ende der Größe der Liste funktionieren, aber sie wird nicht mehr ausgeführt, nachdem die erste '0' entfernt wurde, wie ich auf der Konsole sehen kann. Was ist das Problem? Könnte mir bitte jemand helfen?Warum wird die for-Schleife nicht fortgesetzt

int[] p4={0,0,4}; 

ArrayList<Integer> amountOfColorPoints = new ArrayList<>(); 

. . .

for(int p=0; p<amountOfColorPoints.size(); p++) { 
       if (amountOfColorPoints.get(p) == 0) 
        amountOfColorPoints.remove(p);} 
+4

Sie brauchen einen 'Iterator' –

+0

Denken Sie darüber nach, was Sie tun, entfernen Sie zuerst die erste 0 Sammlung verlässt als' {0,4} ', dann überprüfen Sie, ob der zweite Wert 0 ist, ist es nicht es ist 4 und Ihre Schleife endet. –

+1

Es gibt ein paar Probleme, aber eine der wichtigeren hier ist, dass Sie sowohl * als auch * die Liste gleichzeitig ändern und das ist ein garantierter Bug. Es sei denn, du liegst rückwärts durch deine Liste, was du nicht bist. Als Übung nehmen Sie Stift und Papier und schreiben Sie für Ihr drei-Elemente-Array in jedem Schritt dieses Codes, was mit Ihrer Position und Ihrem Array passiert. Das dauert vielleicht eine Minute, ist aber eine wertvolle Übung. –

Antwort

3

Die sichere Art und Weise Elemente aus einer Sammlung zu entfernen (während es Iterieren) mit Iterator.remove() als Javadoc-

Das Verhalten eines Iterators NOTES ist nicht spezifiziert, wenn die zugrunde liegende Sammlung während der Iteration modifiziert wird läuft in anderer Weise als durch Aufruf dieser Methode.

Etwas wie

Iterator<Integer> iter = amountOfColorPoints.iterator(); 
while (iter.hasNext()) { 
    if (iter.next() == 0) { 
     iter.remove(); 
    } 
} 
0

Bei jeder Iteration der Schleife der Größe des Arrays neu berechnet wird. Also, wenn Sie das Element auf Position 0, die Array-Größe wird zu 2, die zweite 0 verschiebt sich auf Position 0, aber p ist bereits 1, so überspringen Sie die zweite 0.

Korrekter Code:

Iterator<Integer> iter = amountOfColorPoints.iterator(); 
    while (iter.hasNext()) { 
    if (iter.next() == 0) { 
     iter.remove(); 
    } 
    } 
0

Ihr Problem besteht darin, dass beim Entfernen eines Elements alle verbleibenden Elemente nach links verschoben werden, um die Lücke zu füllen. Das nächste Element nach dem Entfernen ist der selbe Index, aber Sie erhöhen den Index immer noch.

Um Sie Code arbeiten, verringern Sie den Index bilden:

for(int p=0; p<amountOfColorPoints.size(); p++) { 
    if (amountOfColorPoints.get(p) == 0) 
     amountOfColorPoints.remove(p--); // decrement 
} 

Ein besserer Ansatz ist es, eine Iterator, zu verwenden, die Sie das aktuelle Element entfernen können (mit über Indizes zu kümmern).

Verwandte Themen