2011-01-11 24 views

Antwort

3

Sie entfernen jedes zweite Element, weil Sie die Liste während der Schleife ändern. d. h., Sie entfernen das 0. Element. In diesem Fall wird es vom 1. Element übernommen und Sie bewegen sich auf das neue 1. Element usw. Wenn Sie einen Debugger verwenden, würden Sie dies sehen.

Am einfachsten ist es, die Elemente in umgekehrter Reihenfolge zu entfernen, da dies nicht dazu führt, dass Elemente verschoben werden.

for(int i=listCon.size()-1; i>=0; i--) 
    removeConnection(listCon.get(i)); 
+0

Tippfehler? i ++ = i-- –

+0

Peter, ich habe mir die Freiheit genommen, '++' in '--' –

+0

@Bart zu ändern, @Will danke. –

7

Das klassische Problem des Löschens von Objekten aus einer Liste, während Sie es durchlaufen.

for(int i=0; i < listCon.size(); i++) 
{ 
    removeConnection(listCon.get(i)); 
} 

Sie

  • Löschen Objekt 0
  • Was Objekt früher 1 Objekt ist jetzt 0, was 2 verwendet werden Objekt jetzt Objekt 1
  • Löschen Objekt 1 (das ist was war Objekt 2 gerade früher)
  • Was einmal Objekt 2 war, ist nun Objekt 1, was früher Objekt 3 war, ist nun Objekt 2

Viele Lösungen dazu. Eine übliche Lösung ist das Löschen von Element 0, bis die Größe 0 ist.

EDIT: Wenn Ihr Ziel wirklich nur ist, das Array ohne andere Operationen zu löschen, dann ist listCon.clear() bei weitem der bessere Ansatz. Ich gehe davon aus, dass removeConnection mehr tut als nur das Element aus der Liste zu entfernen, Sie haben das einfach nicht gezeigt, um Ihr Beispiel einfach zu halten.

+0

Oder benutze 'clear()', oder starte das Entfernen von 'List.size() - 1' und verringere' i', oder initialisiere die 'List':' listCon = new ArrayList (); '. +1 für eine klare Erklärung des Problems. –

+0

Ich wollte das hinzufügen, obwohl ich annahm, dass die 'removeConnection()' -Indirektion darauf zurückzuführen ist, dass 'removeConnection' mehr Säuberungsarbeit leistet, als nur das Element aus der Liste zu entfernen. Wenn das nicht der Fall ist, dann ist clear() eindeutig die bevorzugte Lösung. Ich sollte das wahrscheinlich hinzufügen. – EboMike

+0

Okay, danke für die Lösung, obwohl ich Peters seine Antwort bevorzuge, weil ich eine andere Methode aufrufen musste, bevor das Objekt gelöscht wurde. Grüße – JeffBr

2

Sie ändern die Array-Struktur, während Sie darüber schleifen, was eine wirklich schlechte Idee ist, wie Sie erfahren haben. Da die Array-Elemente verschoben werden, sobald Sie ein Element entfernen, werden Elemente übersprungen. eine while-Schleife wird mit

Der beste Weg, dies zu tun:

while(listCon.size() > 0){ 
    listCont.remove(0); 
} 

@ebomike schlug mich, um es

+0

Das nächste Mal, Will, nächstes Mal :) Immer noch eine Aufwertung wert. – EboMike

2

Was ist mit den Listen .Clear() -Methode?

Und wenn Sie wirklich während des Iterierens Schritt für Schritt entfernen müssen, sollten Sie den Listen-Iterator und seine remove() -Methode verwenden.

+0

Ich möchte in meiner remove-Methode eine bestimmte Verbindung angeben können. Nicht einen ganzen Schwung gleichzeitig. – JeffBr

+0

Ich verstehe es nicht. Ihre remove-Methode funktioniert ordnungsgemäß. Wenn sie von einem Client aufgerufen wird, wird das angeforderte Verbindungsobjekt aus der Liste entfernt. Wie auch immer, Ihre Inaktivierungsmethode scheint alle Verbindungen zu entfernen. In diesem Fall scheint .clear() ausreichend zu sein. – Thomas

5

Sie ändern, was durch 'i' Bezug genommen wird, nachdem in diesem Verfahren ein Objekt aus der Liste zu entfernen:

public void inActivate() 
{ 
    for(int i=0; i < listCon.size(); i++) 
    { 
     removeConnection(listCon.get(i)); 
    } 
} 

Verwenden Sie stattdessen einen Iterator:

Iterator it = listCon.iterator(); 
while(it.hasNext()) 
{ 
    it.remove(); 
} 

oder in In diesem Fall löschen Sie einfach die Liste:

listCon.clear(); 
1

warum nicht einfach verwenden, listCon.clear()?

dass Failing, Reverse Ihre Schleife:

for(int i = listCon.size -1; i >=0; i--) { listCon.remove(i); }

oder als Will Kru schlägt vor, entfernen Sie immer die 0-te Element

Schließlich verwenden einen Iterator und iterator.remove: for(Iterator<Connection> i = listCon.iterator(); i.hasNext();) { Connection c = i.next(); i.remove(); }

Verwandte Themen